Es6 TypeScript arguments

Serginio

Решил побаловаться TypeScript и es6, а в частности Proxy.

Проблема в том, что в отладчике (Edge) показывется и содержимое и длина arguments, а вот в коде все методы преобразования в массив возвращается [] или обращения к длине возвращает 0.

class Item { constructor(public resolve: any, public value: any) { };
}
class CounterComponent { public currentCount: any; private dictionary = {}; private proxy: any; constructor() { this.SetProxy(); } private SetProxy(): void { this.proxy = new Proxy({}, { get: (rcvr, name) => { return () => { let args: Array<any> = []; let length = arguments.length; //length==0 let args1 = [...arguments]; //args1==[] for (let i = 0; i < arguments.length; i++) { args.push(arguments[i]); } let promise = new Promise((resolve, reject) => { // resolve(123); let item = new Item(resolve, args); this.dictionary[name] = item; }); return promise; }; } }); } public async CallMethodAsync() { this.currentCount = await this.proxy.AllHello("Всем Привет"); } public setResult(): void { let key: string; for (let name in this.dictionary) { key = name; } let item = <item>this.dictionary[key]; item.resolve(item.value); }
}
</item></any>

При этом await отрабатывает. И еще есть ли аналог C# финализатор, что бы понять когда объект подвергается сборке мусора.

1 ответ

Serginio

Проблема заключается в том, что одно из ограничений стрелочных функций

<h3><a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions#%D0%9D%D0%B5_%D0%B8%D0%BC%D0%B5%D0%B5%D1%82_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_arguments" rel="nofollow noreferrer" target="_blank">Не имеет собственного объекта arguments</a></h3>

Стрелочные функции не имеют собственного объекта <em>arguments</em>, поэтому в теле стрелочных функций <em>arguments</em> будет ссылаться на переменную в окружающей области.

Самое простое решение - использовать не стрелочную функцию, например

get: (rcvr, name) => { return function() { let args: Array<any> = []; ... }
}
</any>

Альтернативное решение: использовать rest-параметры

get: (rcvr, name) => { return (...args)=>{ ... }
}

В этом случае args уже массив и с ним можно работать сразу без дополнительных операций.

licensed under cc by-sa 3.0 with attribution.