typescript Symbol.iterator

标签 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 中的错误还是我遗漏了什么?

谢谢

最佳答案

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

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() .

关于 typescript Symbol.iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590262/

相关文章:

scala - 输入流的迭代器 : How to close the InputStreams?

tomcat的 Angular 部署问题

angular - TS2531 : Object is possibly 'null'

javascript - 如何将 Typescript 与原生 ES6 Promises 结合使用

javascript - 图表不反射(reflect)事件条目,除非我在标记中将其设置为 array.slice() - 这将禁用选择点 - Stackblitz inside

javascript - 如何编辑我的代码而不出现 setState() 问题?

javascript - 如何将函数/事件监听器添加到使用 ES6 模板文字创建的元素?

javascript - Object.assign 和 object spread 之间的区别(使用 [...] 语法)?

java - 在 TreeSet O(1) 时间内获取最大元素?

java - 当前修改异常 Android 迭代器