Es6 TypeScript arguments

285
12 января 2017, 06:54

Решил побаловаться 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);
    }
}

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

Answer 1

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

Не имеет собственного объекта arguments

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

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

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

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

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

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

READ ALSO
Один post обработчик для нескольких форм. Jquery

Один post обработчик для нескольких форм. Jquery

Здравствуйте, подскажите как приучить код к нескольким формам на странице

386
Как вывести в инпут сегодняшнюю дату при загрузке страницы [требует правки]

Как вывести в инпут сегодняшнюю дату при загрузке страницы [требует правки]

Использую календарь Air Datepicker с форматированием input type="text" data-date-format="с dd M" value="" class=""

256
Вернуть значение стиля

Вернуть значение стиля

После включения чекбокса меняется значение стиля для указанного блока divЗначение устанавливается left:0; и width: 245px;

228