我在TypeScript中有以下两个类。
class BaseIter {
constructor(public a: number, public b: number, public c: number, public d: number){}
*[Symbol.iterator](): Iterator<number> {
yield this.a
yield this.b
yield this.c
yield this.d
}
}
class MyIter extends BaseIter {
get total() {
return this.a + this.b + this.c + this.d
}
*[Symbol.iterator](): Iterator<number> {
for(let x of this){
yield x
}
yield this.total
}
}
const myIter = new MyIter(1, 2, 3, 4);
for (let n of myIter){
console.log(n);
}
BaseIter
类接受四个参数,并在迭代时产生这四个参数。我有扩展BaseIter
的子类,该子类应该使用父代迭代函数,但也会产生额外的值(总计)。当前代码不起作用-它将导致无限递归(在this
上进行迭代将调用相同的函数,而不是基本函数)。我尝试过super
的各种方法都没有运气。
我希望它会产生
1
2
3
4
10
有什么想法吗?
答案 0 :(得分:1)
生成器函数的返回类型为IterableIterator<T>
,而不是Iterator<T>
。这阻止了TypeScript能够将父类中的方法作为可迭代对象使用。通常,除非TypeType警告您不能返回函数的值,否则应该让TypeScript推断函数的返回值。
class BaseIter {
constructor(public a: number, public b: number, public c: number, public d: number) {}
* [Symbol.iterator] () {
yield this.a;
yield this.b;
yield this.c;
yield this.d;
}
}
class MyIter extends BaseIter {
get total () {
return this.a + this.b + this.c + this.d;
}
* [Symbol.iterator] () {
yield * super[Symbol.iterator]();
yield this.total;
}
}
const myIter = new MyIter(1, 2, 3, 4);
for (const n of myIter) {
console.log(n);
}