Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Es6 TypeScript arguments

Решил побаловаться 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 = []; 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 = this.dictionary[key]; item.resolve(item.value);
} }
При этом await отрабатывает. И еще есть ли аналог C# финализатор, что бы понять когда объект подвергается сборке мусора.


Ответ

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

Самое простое решение - использовать не стрелочную функцию, например
get: (rcvr, name) => { return function() { let args: Array = []; ... } }
Альтернативное решение: использовать rest-параметры
get: (rcvr, name) => { return (...args)=>{ ... } }
В этом случае args уже массив и с ним можно работать сразу без дополнительных операций.

Комментариев нет:

Отправить комментарий