Почему TypeScript 2.0 изменил IteratorResult ?

#typescript

#typescript

Вопрос:

Переключение с TypeScript 1.8 на 2.0.3 некоторый код, реализующий итератор, начал генерировать новое сообщение: ошибка TS2322: тип ‘{ done: true; }’ не может быть присвоен типу ‘IteratorResult’. Свойство ‘value’ отсутствует в типе ‘{ done: true; }’.Хотя исправить легко (и обратно совместимо) Я хотел бы понять, почему это изменилось…

По крайней мере, в TypeScript 1.8 IteratorResult было определено value свойство optional . Из lib.es6.d.ts для 1.8:

 interface IteratorResult<T> {
    done: boolean;
    value?: T;
}
  

В разделе 2.0 объявление гласит:

 interface IteratorResult<T> {
    done: boolean;
    value: T;
}
  

При отключении строгой проверки на значение null { done: true, value: undefined } исправление предоставления очевидно, но была ли какая-то веская причина сделать value обязательным в 2.0?

ОБНОВЛЕНИЕ: теперь я обнаружил, что когда я включаю строгую проверку null , ситуация ухудшается, явное использование undefined (как указано выше) также не работает. В конце концов я прибегнул к этому:

 return { done: true, value: undefined } as any as IteratorResult<T>;
  

Для справки, вот пример кода, генерирующего ошибку:

 class HashMapKeyIterable<K,V> implements Iterator<K>, IterableIterator<K> {
    private _bucket: HashMapEntry<K,V>[];
    private _index: number;

    constructor( private _buckets : Iterator<HashMapEntry<K,V>[]> ){
        this._bucket = undefined;
        this._index = undefined;
    }

    [Symbol.iterator]() { return this }

    next():  IteratorResult<K> {
        while (true) {
            if (this._bucket) {
                const i = this._index  ;
                if (i < this._bucket.length) {
                    let item = this._bucket[i];
                    return {done: false, value: item.key}
                }
            }
            this._index = 0
            let x = this._buckets.next();
            if (x.done) return {done: true}; // Under TS 2.0 this needs to
            this._bucket = x.value;          // return {done: true: value: undefined};
            }
        }
    }
  

Обновление: теперь это похоже на ошибку, я отправил проблему 11375 для отслеживания.