【问题标题】:interfaces implemented by Typescript arraysTypescript 数组实现的接口
【发布时间】:2019-10-29 16:01:59
【问题描述】:

在 C# 中,数组实现了IEnumerable 接口,因此我可以编写一个接受IEnumerable 的函数,调用者可以传递实现该接口的数组或其他类(例如List)。

是否有 Typescript 等价物?我想写一个函数来接受数组或任何其他可以迭代的集合,或者生成器函数。

【问题讨论】:

    标签: typescript interface ienumerable


    【解决方案1】:

    我相信您正在寻找Iterable<T>,它依赖于名称为the well-known symbol Symbol.iterator 的方法的存在,该方法实现了iterator protocol。这是 ES2015 或更高版本的一部分,因此如果您使用较旧的运行时,您需要考虑使用 --downlevelIteration compiler option 来定位这些运行时。无论如何,这是你可以使用它的方式:

    function takeIterable<T>(iterable: Iterable<T>) {
        console.log("for-of");
        for (let t of iterable) {
            console.log(t);
        }
    
        console.log("array spread");
        const arr = [...iterable];
        for (let i = 0; i < arr.length; i++) {
            console.log(arr[i])
        }
    
        console.log("manually iterating")
        let iterator = iterable[Symbol.iterator]();
        for (let res = iterator.next(); !res.done; res = iterator.next()) {
            console.log(res.value);
        }
    
    }
    

    Iterable&lt;T&gt; 可以用for...of loop、spread 迭代成一个数组,或者直接使用上面提到的迭代器协议进行迭代。

    那么,在 JavaScript ES2015+ 中,数组、字符串、Sets 和 Maps 已经实现了可迭代协议,或者你可以自己制作:

    takeIterable([1, 2, 3]); // arrays
    takeIterable("hey"); // strings
    takeIterable(new Set(["a", "b", "c", "a"])); // sets
    takeIterable(new Map([["a", 1], ["b", 2], ["c", 3]])); // maps
    
    takeIterable({
        [Symbol.iterator]() {
            return {
                next() {
                    const done = Math.random() > 0.8;
                    return {
                        done,
                        value: done ? undefined : Math.floor(Math.random() * 100)
                    }
                }
            }
        }
    }); // custom iterable
    // e.g., for-of 80 40 array spread 81 80 51 80 50 82 24 manually 28 45 51
    

    好的,希望对您有所帮助;祝你好运!

    Link to code

    【讨论】:

      【解决方案2】:

      我相信你正在寻找的是

      private thing: object[]
      

      或者如果你定义一个接口,语法是

      public interface IClassName {
        propName: object[]
      }
      

      【讨论】:

        【解决方案3】:

        如果您正在寻找 C# 的 IEnumerable&lt;T&gt;,请阅读有关 iterable 和 asyncIterable 符号的信息。一个好的起点:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html

        如果您正在寻找 C# 的 yield,请阅读生成器函数(它们返回 iterables 或 asyncIterables):https://basarat.gitbooks.io/typescript/docs/generators.html

        如果您正在寻找类似 LINQ 的体验,请查看这个零依赖实用程序包:https://www.npmjs.com/package/fluent-iterable

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 2020-04-06
          • 2014-10-10
          • 2023-03-04
          • 1970-01-01
          • 2021-07-20
          相关资源
          最近更新 更多