【问题标题】:Recommended way to implement Iterator<T> in Typescript, before ES6 [duplicate]在 ES6 之前在 Typescript 中实现 Iterator<T> 的推荐方法 [重复]
【发布时间】:2016-12-22 11:22:47
【问题描述】:

我有一个项目,其中包含许多理想情况下可以实现Iterable&lt;T&gt; 和/或Iterator&lt;T&gt; 接口的类。但是我似乎找不到这些接口的标准 TypeScript 定义(例如在 typescript-collections 或一些类似的包中)。

我知道这些在 ECMAScript 6 中通过Symbol.iterator 机制在某种程度上已经标准化,但我的目标是 ECMAScript 5,并且在可预见的未来将保持不变。

我能否在不自己定义的情况下以某种方式获得这些接口(例如,为了将来与其他模块的兼容性)?

【问题讨论】:

    标签: javascript typescript interface iterator iterable


    【解决方案1】:

    这是typescript: make class objects iterable的副本,但这是ES5的答案:

    你想使用ES6 feature

    ECMAScript 2015 (ES6) 的一个补充不是新语法或新 内置的,但是一个协议。该协议可以由任何 尊重某些约定的对象。

    有两种协议:可迭代协议和迭代器 协议。

    ES5 环境(编译和/或运行时)中,这不是您可以做的。
    话虽如此,您可以足够接近because

    当一个对象知道如何从一个对象访问项目时,它就是一个迭代器。 一次收集一个,同时跟踪其当前位置 在那个序列内。在 JavaScript 中,迭代器是一个对象 提供了一个 next() 方法,该方法返回序列中的下一项。 该方法返回一个具有两个属性的对象:done 和 value。

    所以你可以只返回一个带有next 方法的对象,它是一个迭代器:

    class Counter /* implements Iterator<number> */ {
        private counter = 0;
    
        //public next(): IteratorResult<number> {
        public next(): { done: boolean, value: number } {
            return {
                done: false,
                value: this.counter++
            }
        }
    }
    
    let c = new Counter();
    console.log(c.next().value); // 0
    console.log(c.next().value); // 1
    console.log(c.next().value); // 2
    

    (code in playground)

    注释掉的部分将与目标ES6 一起使用,但在低于目标时则不行。
    但是如果你的运行环境确实支持这个特性,那么编译出来的 js 就可以很好地完成这项工作。

    【讨论】:

    • 感谢您的回答。我正在寻找的是某种类型的 ES6 之前的打字稿标准,但它似乎不存在。例如,如果我想实现sort(collection: Iterable&lt;E&gt;),如果我理解正确,我必须自己定义Iterable 接口。
    • 是的,没错,但是如果您使用名称Iterable,那么您需要考虑当您移至ES6 并且该接口已经存在时会发生什么。
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多