新しい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のスーパーセットを目指していると言ったとき、それがサポートするすべての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;
ここで、 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で確認できません-これが標準の動作とは対照的にオプションの背後に隠されているのはなぜですか? これは常にオプションのままですか?
@ lhunath2.3の公式リリース情報にあります。 これは、反復可能オブジェクト(配列を含む)のすべての使用において、生成されるコードのサイズ、および潜在的にパフォーマンスに非常に大きな影響を与えるため、オプションです。 トレードオフは表現力を高める価値があると思いますが、既存のコードをより遅く、より複雑にすることは、フラグがあることの合理的な正当化のように思えます。
最も参考になるコメント
これは本当に残念です。 今日は、TraceurとBabelを使用して、反復可能でターゲットのES5でfor-ofを使用できます。 私たちのチームがTraceurからTypeScriptに切り替えることを提案することに興味がありますが、TypeScriptのこの制限により、それが発生しなくなります。 TypeScriptがES6のスーパーセットを目指していると言ったとき、それがサポートするすべてのES6機能のES5ブラウザーをターゲットにする機能を含める必要があると思います。