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+,数组,字符串,Set
s and Map
s,已经实现了可迭代协议,或者你可以自己制作:
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
好的,希望对你有帮助;祝你好运!
如果您正在寻找 C# 的 IEnumerable<T>
,请阅读 iterable 和 asyncIterable 符号。一个好的起点: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
在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+,数组,字符串,Set
s and Map
s,已经实现了可迭代协议,或者你可以自己制作:
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
好的,希望对你有帮助;祝你好运!
如果您正在寻找 C# 的 IEnumerable<T>
,请阅读 iterable 和 asyncIterable 符号。一个好的起点: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