【问题标题】:typescript iterators playground error打字稿迭代器游乐场错误
【发布时间】:2017-10-09 12:26:15
【问题描述】:

我有以下代码 sn-p:

var iterator: IterableIterator<string> = iterBreadth(tree);
for(var item of iterator){
  log(item)
}

iterBreadth 只是一个返回迭代器的生成器函数。 TypeScript 中的迭代器是 IterableIterator&lt;T&gt; 类型,在我的例子中,Tstring

我的问题是 - 为什么操场在 for..of 迭代器循环行对我大喊大叫:

?

为什么迭代器仅限于数组和字符串?


我在official docs 发现,当以 ES3 或 ES5 为目标时,for..of 循环中只允许使用数组。但这并不能解释操场错误消息中字符串的作用。


此外,我可以看到打字稿很难转译for..of。以下代码似乎精确地针对数组进行了转换,因为它只是迭代索引 (0, 1, 2),而不是调用 next:

var iterator = iterBreadth(tree);
for (var _i = 0, iterator_1 = iterator; _i < iterator_1.length; _i++) {
    var item = iterator_1[_i];
    log(item);
}

【问题讨论】:

  • 您需要定位es6(或更高版本)才能做到这一点。但似乎你已经知道了,所以你到底在问什么?为什么需要定位es6
  • @NitzanTomer 不,问题是关于错误消息的。为什么显示string类型?!我发现它具有误导性。

标签: typescript iterator iteration


【解决方案1】:

Typescript 2.3 added support for generators and the Iterator protocol for ES3 and ES5 targets。使用新的--downlevelIteration 选项,您的示例编译不会出错:

tsc --lib es6 --target es5 --downlevelIteration t.ts

--downlevelIteration 选项在 typescript Playground 中不可用。

【讨论】:

    【解决方案2】:

    您可以使用 for/of 循环遍历字符串字符:

    const str = "str";
    for (let char of str) {
        console.log(char);
    }
    

    输出:

    s
    t
    r

    这就是错误消息显示string 的原因。

    【讨论】:

      【解决方案3】:

      Nitzan 的回答涵盖了一个很好的解决方案。如果出于任何原因,您需要将可迭代对象作为数组处理,您可以使用 Array.from()

      var iterator: IterableIterator<string> = iterBreadth(tree);
      for(var item of Array.from(iterator)){
          log(item)
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        相关资源
        最近更新 更多