我正在尝试创建一个自定义的可迭代对象。
这是我的代码的一个简化示例:
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/