打字稿 Symbol.iterator

typescript Symbol.iterator

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

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

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,否则你可能会在这些浏览器的意想不到的地方出现运行时错误。
  • Select 更高的目标,ES2015 或更高版本会起作用。然后你可以使用 Babel 进一步向下编译(你还需要一个运行时 polyfill 来使 Symbols 工作)
  • 使用 while 并调用 testingIterables.next().
  • 自行解包迭代器