我有以下两个类型脚本类。

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调用同一个函数,而不是基函数)。我试过各种方法都不走运。
我希望它能产生
1
2
3
4
10

有什么想法吗?

最佳答案

生成器函数的返回类型为IterableIterator<T>,而不是Iterator<T>。这使得typescript无法将超类中的方法用作iterable。一般来说,您应该让Type脚本推断出您的函数的返回值,除非它警告您它不能。

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);
}

09-28 00:31