2017-04-19 80 views
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。

回答

0

所有默认的迭代器对象也都是可迭代的,所以你可以做

*[Symbol.iterator](): Iterator<number> { 
    for (let item of super[Symbol.iterator]()) { 
     if (this.filter(item)) { 
      yield item; 
     } 
    } 
} 
+0

这确实似乎是一个错误的打字稿给我。 Woops,你用错误消除了评论。你明白了吗? – loganfsmyth

+0

是的,不知道我在测试时弄错了什么,但是当我再次尝试时,它工作正常。编译器仍然抱怨,直到我将生成器的返回类型更改为IterableIterator。很好,谢谢。 :) – Mud