如果新的sintax for (let value of values)
与迭代器一起使用,那就太好了; 即:
for (let value of myMap.values()) {
doSomething(value);
}
与#2695相关。
如果您的目标是ES6,则已经允许这样做:
interface MyMap<T> {
values(): Iterable<T>;
}
var myMap: MyMap<string>;
for (let value of myMap.values()) {
var s: string = value;
}
ES5 / ES3不允许这样做的原因是:
由于这些因素,在ES3 / ES5中,for..of循环中仅允许使用数组(这是当今JS语言中最常见的可迭代对象); 对于以ES6为目标(即,运行时引擎支持可迭代和可迭代数组),除了数组,字符串,映射和集合等外,还允许自定义可迭代。
明白了...
@mhegazy非常感谢您的详细回复!!!
我觉得这真令人失望。 今天,我可以在Traceur和Babel中对任何可迭代的目标ES5使用for-of。 我对提议我们的团队从Traceur切换到TypeScript感兴趣,但是TypeScript中的这种限制将阻止这种情况的发生。 当TypeScript表示其目标是成为ES6的超集时,我认为需要包括针对ES5浏览器支持的所有ES6功能的功能。
我想我可以使用TypeScript定位到ES6,然后通过Traceur或Babel运行该输出。 我真的不想这么做。
作为此问题的更新,目标ES3 / ES5现在使用--downlevelIteration
支持迭代器协议。 有关更多信息,请参见#12346。
看来应该为TS 2.3修复此问题,但是我正在运行TS 2.3.3,并且
for (let [ i, observationPoint ] of observationPointsList.entries())
observationPoints[ observationPoint.spot || (i + 1) ] = observationPoint;
其中observationPointsList
是ObservationPointModel[]
,产生:
[11:30:56] typescript: src/models/observation-set.ts, line: 44
Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type.
我想念什么吗?
@lhunath必须指定--downlevelIteration
选项。
嗯,的确如此。 我在本文档或#12346中看不到-为什么将其隐藏在选项中而不是标准行为? 这将始终保持可选状态吗?
@lhunath在2.3的
最有用的评论
我觉得这真令人失望。 今天,我可以在Traceur和Babel中对任何可迭代的目标ES5使用for-of。 我对提议我们的团队从Traceur切换到TypeScript感兴趣,但是TypeScript中的这种限制将阻止这种情况的发生。 当TypeScript表示其目标是成为ES6的超集时,我认为需要包括针对ES5浏览器支持的所有ES6功能的功能。