2017-11-08 8 views
1

私は活字体は予想通り、現代のブラウザで動作している、正しく次の発電機ループをコンパイルするために取得しようとしています:ジェネレータ `

/** Should print "x= 1 y= 2" **/ 
function* gen() { yield [1, 2] } 
for (const [x, y] of gen()) { console.log("x=", x, "y=", y) } 

しかし、それをして、実行した後Typescriptが失敗します。上記をthe Typescript Playgroundに置くと、失敗が示されます。つまり、for-ofは配列の反復ループに変換されますが、ジェネレータはオブジェクトを返しています。

Typescriptが壊れているようですが、これは既知の問題ですか?私はhttps://github.com/Microsoft/TypeScriptにそれを見ませんでした。

どのような最善の回避策ですか?ジェネレータ機能でArray.fromを使用すると、私は最も一貫していると私に襲いかかりますか?

+0

typecriptをそのままコードに残しておきたい場合は、_ "target": "es6" _ –

+0

@AlekseyLのコンパイラオプションでターゲットとしてes6を指定できます。その目的は、Knockout.jsライブラリのES3互換性です。 –

+0

プレイグランドであなたのサンプルを実行すると、実際にはエラーが発生します。「タイプ 'IterableIterator 'は配列型でも文字列型でもありません。 https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html#targeting-es5-and-es3 – str

答えて

1

正しいですが、for ofループがes5/es3ターゲット内の単純な配列ループに移動しているという問題があります。

"downlevelIteration": truetsconfig.jsonに追加すると、そのコードは正常に動作し、結果のコードは完全に異なって見えます。

他のfor ofループがプレーン・アレイに対して反復処理すると、下位反復でパフォーマンスが低下することに注意してください。 (Which is why downlevel iteration is hidden behind a flag)。

また、this、特に、--importHelpersとtslibを使用してコードサイズを減らす方法についての部分を読んでいます。