我的类 Package 了一个可迭代对象并实现迭代,如下所示:
[Symbol.iterator]() { return this.range[Symbol.iterator](); }
编译器 * 不强制 * implements Iterable<T>
信息-为什么?
class SomeWrapper /* implements Iterable<number> */ {
constructor(public readonly range: MyRange) {}
[Symbol.iterator]() { return this.range[Symbol.iterator](); }
}
class MyRange {
constructor(
public readonly begin: number,
public readonly end: number
) {}
[Symbol.iterator]() {
return new MyRangeIterator(this);
}
}
class MyRangeIterator implements Iterator<number>
{
public index: number
public end: number
constructor(range: MyRange)
{
this.index = range.begin;
this.end = range.end
}
public next(): IteratorResult<number, "no_more_values">
{
if (this.index < this.end) {
return { done: false, value: this.index++ }
}
return { done: true, value: "no_more_values" }
}
}
用法:
const range = new MyRange(5, 14);
const wrapper = new SomeWrapper(range)
for (const x of wrapper) { // I expected an error here: SomeWrapper - Not Iterable
console.log(x)
}
1条答案
按热度按时间wrrgggsh1#
TypeScript不检查类
implements
Iterable
,但检查类是否具有Symbol.iterator
属性。当您移除此属性或使此属性不返回迭代器时,它将不再进行类型检查。
Iterators and Generators对此进行了解释。
如果一个对象具有Symbol.iterator属性的实现,则该对象被视为可迭代的。
TypeScript通常以这种方式进行类型检查,因为它基于structural subtyping。
例如,即使
Y
不是implements
X
,也会执行类型检查。