0
编辑:loganmsmyth的答案是正确的。我的生成器函数的返回类型应该是IterableIterator,但是我将它作为原始文件留下,所以这个问题很有意义。访问超类Symbol.iterator
子类是否可以自然地使用其超类的迭代器?
我可以这样写:
class Source {
*[Symbol.iterator](): Iterator<number> {
yield 0;
yield 1;
yield 2;
}
}
class Filtered extends Source {
constructor(private filter: (item: number) => boolean) {
super();
}
*[Symbol.iterator](): Iterator<number> {
let it = super[Symbol.iterator]();
for (let item = it.next(); !item.done; item = it.next()) {
if (this.filter(item.value)) {
yield item.value;
}
}
}
}
let list = new Filtered(item => item % 2 == 0);
for (let item of list) {
console.log(item);
}
但我宁愿没有手动消耗赤裸裸的迭代器在Filtered[Symbol.iterator]
,而是写的是这样的(非法):
*[Symbol.iterator](): Iterator<number> {
for (let item of super) {
if (this.filter(item)) {
yield item;
}
}
}
仅供参考,本是针对ES5的Typescript 2.3。
这确实似乎是一个错误的打字稿给我。 Woops,你用错误消除了评论。你明白了吗? – loganfsmyth
是的,不知道我在测试时弄错了什么,但是当我再次尝试时,它工作正常。编译器仍然抱怨,直到我将生成器的返回类型更改为IterableIterator。很好,谢谢。 :) – Mud