我有以下代码段:
var iterator: IterableIterator<string> = iterBreadth(tree);
for(var item of iterator){
log(item)
}
iterBreadth
只是一个返回迭代器的生成器函数。 TypeScript中的迭代器属于IterableIterator<T>
类型,其中T
在我的情况下是string
。
我的问题是 - 为什么游乐场在for..of
迭代器循环线上对我大喊大叫:
为什么迭代器仅限于数组和字符串?
我在official docs发现,在定位ES3或ES5时,for..of
循环中只允许使用数组。但这并没有解释在操场上erorr消息中字符串的作用。
此外,我可以看到打字稿很难转换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);
}
答案 0 :(得分:2)
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中不可用。
答案 1 :(得分:1)
您可以使用for / of循环迭代字符串字符:
const str = "str";
for (let char of str) {
console.log(char);
}
输出:
取值
Ť
r
这就是错误消息显示为string
的原因。
答案 2 :(得分:0)
Nitzan的答案涵盖了一个很好的解决方案。如果出于任何原因,您需要将迭代作为数组处理,则可以使用Array.from()
var iterator: IterableIterator<string> = iterBreadth(tree);
for(var item of Array.from(iterator)){
log(item)
}