【问题标题】:TypeScript: implementation of [Symbol.iterator]: why it doesn't work on unit test (Karma + Jasmine?TypeScript:[Symbol.iterator] 的实现:为什么它在单元测试中不起作用(Karma + Jasmine?
【发布时间】:2018-04-16 10:48:13
【问题描述】:

我的接口定义了迭代器:

[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。但我也需要我的单元测试工作...... :(((

【问题讨论】:

  • 您能否将您的tsconfig.json、typescript 版本以及您传递给tsc 的任何命令行标志发布?我在答案中发布的一些链接具有特定的标志并排除了某些发射级别。
  • @SeanNewell,我在 GitHub 上发布了我的代码示例:github.com/Andrey-Bushman/webstorm-using。我的测试“#Iterator 迭代文档”。失败了。
  • 您的 JS 示例在 Typescript 中工作(应该如此),让我尝试编写一个可编译为类似内容的类...
  • 在我的项目中,是DocumentManager类。
  • 得到了一些工作:D 在迭代器上有/没有类型显式注释。正在编辑我的答案...

标签: typescript


【解决方案1】:

我不确定你做错了什么,但这里有一些可以正常编译和运行的打字稿代码:

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 工作正常。您的代码可能还有其他问题。尝试编写一个最小的独立脚本,让您感兴趣的部分协同工作,并隔离调用站点。


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

您需要实现接口(@98​​7654329@ 函数),而不仅仅是产生值。 This online gitbook does a good job on how to implement an interator in TS.

Here's a related PR that describes more details of the TS implementation.

for-of 下层发射存在一些问题,因此请确保您的 tsconfig 设置正确。 (target es6, as per this issue)

注意 - 值得一提 this other SO answer,问题略有不同,但链接的答案明确谈到了一个看起来更像这个 OP 正在寻找的 Iterable 版本。

【讨论】:

  • @AndreyBushman 值得注意的是,我已经安装了 node v8.5.0,但由于您的打字稿版本/配置似乎井井有条,因此不确定还有什么可能。
  • 我的节点版本是v8.6.0
  • 我添加了 UPD 2 部分。
  • 有趣的更新 - 我知道的不够多,无法指导您更多,也许可以尝试调查 karma-typescript 看看它是否不尊重您的 es6 编译器选项?
  • 我安装了karma-typescript-es6-transform 并将该信息添加到carma.conf.ts 文件中,但问题仍然存在。
猜你喜欢
  • 2016-05-14
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2015-12-07
  • 2017-09-21
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多