TypeScript:实现[Symbol.iterator]:为什么它不适用于单元测试(Karma + Jasmine?



我的接口定义迭代器:

[Symbol.iterator]() : IterableIterator<IDocument>;

我的类DocumentManager实现了这个接口:

*[Symbol.iterator](): IterableIterator<IDocument>{
for(let n of this._documents){// this._documents is Array<IDocument>
yield n;
}
}

在调试模式下,我看到this._documents有三个文档,但这个代码没有迭代:

let m = 0;
for(let n of app.documentManager){
++m;
}
// here m == 0 still...

所以迭代不会发生。我做错了什么?

UPD

例如,它在JavaScript:中工作

let collection = {
items : ['a','b','c','d','e'],
*[Symbol.iterator](){
for(let item of this.items){
yield item;
}
}
};
for(let n of collection){
console.log(n);
}

为什么我的TypeScript有问题?

UPD2

哦,现在我发现它不仅适用于单元测试(Karma+Jasmine),而且适用于Node.js。但我也需要我的单元测试……:(

我不确定你做错了什么,但这里有一些编译和运行良好的typescript代码:

interface IterateNum {
[Symbol.iterator](): IterableIterator<number>;
}
class Collection implements IterateNum {
private items = [1,2,3,4]; // can be Array<T>
constructor() {}
*[Symbol.iterator]() {
for(let i of this.items) {
yield i;
}
}
}
for(let n of (new Collection())) {
console.log(n);
}

我写了上面的代码,并复制了您的tsconfig.json,运行tscnode dist/file.js工作得很好。您的代码可能有其他问题。试着写一个最小的、独立的脚本,让你感兴趣的部分一起工作,并隔离呼叫站点。


关于此功能集的一般说明:

您需要实现接口(next函数),而不仅仅是生成值。这个在线gitbook在如何在TS中实现interator方面做得很好。

下面是一个相关的PR,它描述了TS实现的更多细节。

for-of的低电平发射有一些不稳定,所以请确保tsconfig设置正确。(目标es6,根据本期)

注意——值得一提的是,另一个SO答案,这个问题略有不同,但链接的答案明确地谈到了一个看起来更像这个OP所寻找的Iterable版本。

最新更新