Typescript: for ..of with iterators

作成日 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のスーパーセットを目指していると言ったとき、それがサポートするすべてのES6機能のES5ブラウザーをターゲットにする機能を含める必要があると思います。

全てのコメント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の公理の1つは、型指定の発行を行わないことです。 つまり、発行されたコードは、型システムがコードについてどのように考えているかに依存するのではなく、入力ソースの構文変換として依存します。
  • 完全なイテレータエミュレーションを実行するということは、Symbolのポリフィルに依存する必要があることを意味します。これも、維持したいもう1つの品質です。
  • 生成された完全な反復ロジックは安価ではありません。値を使用しない場合は、next()を呼び出して、完了を確認する必要があります。失敗した場合は戻ります。 これは、追加のディスパッチ、2つのプロパティルックアップ、およびループのすべての反復でのオブジェクト割り当てです。 放出されたコードを単純にし、特にパフォーマンス特性においてソースに関連性を持たせるように努めました。
  • 最後に、カスタムの反復可能なオブジェクトでこれらすべてを実行するには、配列で実行する必要があります。配列はES5 / ES3でこのサポートを備えておらず、型指定の発行を実行したくないため、配列を変換する必要があります。反復可能になります。これは、通常のforループよりも大幅に遅くなります。 主な問題は、配列のループを見ると、このコストが発生するかどうかが明確でないことです。

これらの要因の結果として、ES3 / ES5では、配列のみがfor..ofループで許可されます(今日のJS言語で利用可能な最も一般的な反復可能オブジェクトとして)。 ES6をターゲットにする場合(つまり、反復可能配列と反復可能配列のランタイムエンジンサポートを使用)、配列、文​​字列、マップ、セットなどに加えて、カスタム反復可能オブジェクトが許可されます。

わかった...
@mhegazy詳細な回答ありがとうございます!!!

これは本当に残念です。 今日は、TraceurとBabelを使用して、反復可能でターゲットのES5でfor-ofを使用できます。 私たちのチームがTraceurからTypeScriptに切り替えることを提案することに興味がありますが、TypeScriptのこの制限により、それが発生しなくなります。 TypeScriptがES6のスーパーセットを目指していると言ったとき、それがサポートするすべてのES6機能のES5ブラウザーをターゲットにする機能を含める必要があると思います。

TypeScriptを使用してES6をターゲットにし、その出力をTraceurまたはBabelで実行できると思います。 私は本当にそれをする必要はありません。

この問題の更新として、イテレータプロトコルが--downlevelIterationを使用するターゲットES3 / ES5でサポートされるようになりました。 詳細については、#12346を参照してください。

これはTS2.3で修正されるはずですが、TS2.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 評価