Typescript数组实现的接口

interfaces implemented by Typescript arrays

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

是否有对应的 Typescript?我想编写一个接受数组或任何其他可以迭代的集合或生成器函数的函数。

我相信你要找的是

private thing: object[]

或者如果您要定义接口,则语法为

public interface IClassName {
  propName: object[]
}

我相信您正在寻找 Iterable<T>, which relies on the presence of a method whose name is the well-known symbol Symbol.iterator which implements the iterator protocol. This is something that's part of ES2015 or later, so if you're using older runtimes you'll need to consider using the --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<T>可以用一个for...of loop, spread迭代到一个数组中,或者直接使用上面提到的迭代器协议进行迭代。

然后,在JavaScript ES2015+,数组,字符串,Sets and 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

如果您正在寻找 C# 的 IEnumerable<T>,请阅读 iterableasyncIterable 符号。一个好的起点:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html

如果您正在寻找 C# 的 yield,请阅读 生成器函数 (它们 return 可迭代对象或异步可迭代对象):https://basarat.gitbooks.io/typescript/docs/generators.html

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