访问超类Symbol.iterator

时间:2017-04-19 15:32:33

标签: typescript ecmascript-6

编辑:loganmsmyth的回答是正确的。我的生成器函数的返回类型应该是IterableIterator,但是我把它保留为原始的,所以问题是有道理的。

子类是否可以自然地使用其超类的迭代器?

我可以这样写:

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。

1 个答案:

答案 0 :(得分:0)

所有默认迭代器对象也是可迭代的,因此您可以执行

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