打字稿Symbol.iterator

Yariv Katz

我正在尝试创建一个自定义的迭代器。

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

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中的错误,还是我缺少什么?

谢谢

马达拉的幽灵

这不是错误。这取决于您的目标。

TypeScript做出了一个(非常糟糕的)设计决策,即如果将TS转换for..of为ES5或ES3,它会发出一个正常for (var i; i < testingIterables.length; i++)循环。

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

有几种解决方法:

  • 如果您的TypeScript超过2.3,则可以将downlevelIteration标志设置为true,这将导致TypeScript正确地编译迭代器,但是这意味着对于不支持的浏览器您必须在运行时中包含Symbol.iterator polyfill,否则您可能会遇到意外运行时错误的风险这些浏览器的位置。
  • 选择更高的目标,ES2015或更高版本将起作用。然后,您可以使用Babel进一步向下编译(您还需要运行时polyfill才能使Symbols正常工作)
  • 使用while和调用您自己解开迭代器testingIterables.next()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章