Typescript: for..of与迭代器

创建于 2015-05-14  ·  9评论  ·  资料来源: microsoft/TypeScript

如果新的sintax for (let value of values)与迭代器一起使用,那就太好了; 即:

for (let value of myMap.values()) {
    doSomething(value);
}

与#2695相关。

Question

最有用的评论

我觉得这真令人失望。 今天,我可以在Traceur和Babel中对任何可迭代的目标ES5使用for-of。 我对提议我们的团队从Traceur切换到TypeScript感兴趣,但是TypeScript中的这种限制将阻止这种情况的发生。 当TypeScript表示其目标是成为ES6的超集时,我认为需要包括针对ES5浏览器支持的所有ES6功能的功能。

所有9条评论

如果您的目标是ES6,则已经允许这样做:

interface MyMap<T> {
    values(): Iterable<T>;
}
var myMap: MyMap<string>;

for (let value of myMap.values()) {
    var s: string = value;
}

ES5 / ES3不允许这样做的原因是:

  • TypeScript公理之一是不进行类型定向的发射。 也就是说,发出的代码不依赖于类型系统对您的代码的看法,而是依赖于输入源的语法转换。
  • 进行完整的迭代器仿真将意味着我们必须依靠Symbol的pollyfill,这也是我们希望保持的另一种质量
  • 生成的完整迭代逻辑不是很便宜,您需要调用next()并检查完成,如果未使用该值则返回失败。 这是附加的分派,两个属性查找以及每个循环迭代的对象分配。 我们已经尝试使发出的代码简单且与源代码相关,特别是在性能方面
  • 最后,要对自定义可迭代对象执行所有这些操作,我们仍然需要在数组上执行此操作,因为数组在ES5 / ES3中没有此支持,并且我们不想执行类型定向的发射,因此需要转换数组迭代,这比正常的for循环要慢得多。 而主要问题是,从查看阵列上的循环是否会产生这种费用尚不清楚。

由于这些因素,在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;

其中observationPointsListObservationPointModel[] ,产生:

[11:30:56]  typescript: src/models/observation-set.ts, line: 44 
            Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type. 

我想念什么吗?

嗯,的确如此。 我在本文档或#12346中看不到-为什么将其隐藏在选项中而不是标准行为? 这将始终保持可选状态吗?

@lhunath2.3

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

wmaurer picture wmaurer  ·  3评论

Antony-Jones picture Antony-Jones  ·  3评论

dlaberge picture dlaberge  ·  3评论

manekinekko picture manekinekko  ·  3评论

siddjain picture siddjain  ·  3评论