G. *_*lon 8 javascript iterator iterable interface typescript
我有一个项目,包括许多理想情况下将实现Iterable<T>和/或Iterator<T>接口的类.但是我似乎无法找到这些接口的标准TypeScript定义(例如在typescript-collections或类似的包中).
我理解这些在ECMAScript 6中通过该Symbol.iterator机制有些标准化,但我的目标是ECMAScript 5,并且在可预见的未来将保持这样.
我可以以某种方式获取这些接口而不自己定义它们(例如,为了将来与其他模块的兼容性)?
这是以下内容的副本:typescript: make class objects iterable,但这里有一个答案ES5:
你想使用一个ES6功能:
ECMAScript 2015 (ES6) 的新增功能不是新语法或新内置,而是协议。该协议可以由任何遵守某些约定的对象来实现。
有两种协议:可迭代协议和迭代器协议。
在ES5环境(编译和/或运行时)中,这不是您可以做的。
话虽如此,您可以足够接近,因为:
当一个对象知道如何一次访问一个集合中的项目,同时跟踪它在该序列中的当前位置时,它就是一个迭代器。在 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
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
注释掉的部分将与目标一起使用ES6,但当它低于目标时则无效。
但是,如果您的运行时环境确实支持此功能,那么编译后的 js 就可以很好地完成这项工作。
| 归档时间: |
|
| 查看次数: |
6279 次 |
| 最近记录: |