【发布时间】:2019-10-29 16:01:59
【问题描述】:
在 C# 中,数组实现了IEnumerable 接口,因此我可以编写一个接受IEnumerable 的函数,调用者可以传递实现该接口的数组或其他类(例如List)。
是否有 Typescript 等价物?我想写一个函数来接受数组或任何其他可以迭代的集合,或者生成器函数。
【问题讨论】:
标签: typescript interface ienumerable
在 C# 中,数组实现了IEnumerable 接口,因此我可以编写一个接受IEnumerable 的函数,调用者可以传递实现该接口的数组或其他类(例如List)。
是否有 Typescript 等价物?我想写一个函数来接受数组或任何其他可以迭代的集合,或者生成器函数。
【问题讨论】:
标签: typescript interface ienumerable
我相信您正在寻找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<T> 可以用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
好的,希望对您有所帮助;祝你好运!
【讨论】:
我相信你正在寻找的是
private thing: object[]
或者如果你定义一个接口,语法是
public interface IClassName {
propName: object[]
}
【讨论】:
如果您正在寻找 C# 的 IEnumerable<T>,请阅读有关 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
【讨论】: