从TypeScript 1.8切换到2.0.3一些实现Iterator的代码已经开始生成一条新消息:错误TS2322:输入'{done:true; }'不能赋值为'IteratorResult'。类型'{done:true; }'。虽然修复很容易(并向后兼容),但我想了解它为什么会发生变化......
至少在TypeScript 1.8下,IteratorResult
定义了value
属性可选。从lib.es6.d.ts for 1.8:
interface IteratorResult<T> {
done: boolean;
value?: T;
}
在2.0下,声明如下:
interface IteratorResult<T> {
done: boolean;
value: T;
}
通过严格的空检查关闭,提供{ done: true, value: undefined }
修补程序是显而易见的,但是有一些很好的理由让value
在2.0中强制执行吗?
更新:我现在发现,当我打开严格空检查时,这会变得更糟,显式使用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来跟踪。