如何从孩子的Symbol.iterator中调用父类的Symbol.iterator

时间:2019-07-16 23:20:00

标签: node.js typescript

我在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

有什么想法吗?

1 个答案:

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