子类是否可以自然地使用其超类的迭代器?
我可以这样写:
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。
答案 0 :(得分:0)
所有默认迭代器对象也是可迭代的,因此您可以执行
*[Symbol.iterator](): Iterator<number> {
for (let item of super[Symbol.iterator]()) {
if (this.filter(item)) {
yield item;
}
}
}