打字稿Symbol.iterator

时间:2018-02-02 20:16:38

标签: typescript ecmascript-6 iterator iterable

我正在尝试创建自定义迭代。

这是我的代码的简化示例:

class SortedArray {
    *[Symbol.iterator]() {
        yield 1;
        yield 2;
        yield 3;
        return 4;
    }
}
const testingIterables = new SortedArray();
for(let item of testingIterables as any) { // i have to cast it as any or it won't compile
    console.log(item);
}

此代码将在ES6上正确运行,但使用TypeScript,它将编译而不打印可迭代值。

这是TypeScript中的错误还是我遗漏了什么?

由于

1 个答案:

答案 0 :(得分:6)

这不是一个错误。这取决于你的目标。

TypeScript做了一个(在我看来很可怕)设计决策,如果你将TS for..of转换为ES5或ES3,它会发出正常的for (var i; i < testingIterables.length; i++)循环。

因此,对于目标ES5和ES3,for..of循环中只允许使用数组和字符串。

有几种方法可以解决这个问题:

  • 如果您的TypeScript超过2.3,您可以将downlevelIteration标志设置为true,这将导致TypeScript正确编译迭代器,但这意味着您必须在运行时为非Non。 - 支持浏览器,否则在这些浏览器的意外位置存在运行时错误。
  • 选择更高的目标,ES2015或更高版本可行。然后,您可以使用Babel进一步向下转换(您还需要运行时polyfill才能使符号有效)
  • 使用while自行展开迭代器并调用testingIterables.next()