最終更新
最終更新
イテレータ自体はTypeScriptまたはES6の機能ではなく、オブジェクト指向プログラミング言語において一般的な、"振る舞いに関するデザインパターン"です。これは、一般的に次のインターフェースを実装するオブジェクトです。
() このインターフェースは、コレクションまたはシーケンスのオブジェクトに属する値を取得することを可能にします。
IteratorResult
は単なるvalue
+done
のペアです:
何らかのframeという名前のオブジェクトがあると想像してください。このframeは、コンポーネントの一覧で構成されています。イテレータのインターフェースは、frameオブジェクトのコンポーネントを次のように取得することを可能にします。
上のコードでも良いでしょう。しかし、もっと便利にできます。ES6は反復可能プロトコルを定義しており、その1つは[Symbol.iterator]シンボルです。これを利用して、for...of
で反復可能なオブジェクトを実装できます:
残念ながら frame.next()
はこのパターンでは動作しません。また、見た目が少し不格好です。そこで助けになるのがTypeScriptで利用できる IterableIterator
インターフェースです:
frame.next()
とfor
ループの両方が、IterableIteratorインターフェースでうまく動作するようになりました。
イテレータが反復する対象は有限個である必要はありません。典型的な例はフィボナッチ計算の処理です:
上記のコード例はES6をターゲットにしてコンパイルする必要がありますが、ES5をターゲットにしても、 Symbol.iterator
をサポートしている場合は、動作する可能性があります。これは、ES6 lib(es6.d.ts)をプロジェクトに追加してES5をターゲットにコンパイルすることで可能です。コンパイルされたコードは、node 4+、Google Chrome、その他のブラウザで動作するはずです。
繰り返しになりますが、イテレータ自体はTypeScriptの機能ではありません。このコードはIterator
とIteratorResult
のインターフェースを明示的に実装しなくても動作します。しかしながら、ES6のを使うことはコードの一貫性を保つ上で非常に便利です。