2023)では、反復処理(iteration)のためのインターフェースとして、IterableIteratorAsyncIterableAsyncIteratorIteratorResultの5つが定義されている。IterableIterableは、Iteratorにしたがうオブジェクトを返す関数@@iterator(Symbol.iterator)をプロパティとして必ず持つことを示すインターフェースである。TypeScriptではそのまま次のように定義されている。Iterator<T>;}※引用するコードにもともとあったコメントは省略してある。この@@iteratorは、for...of文、yield*式、...演算子などを使った際にも暗黙的に呼ばれる(抽象操作GetIteratorを参照)。console.log(item)}AsyncIterableAsyncIterableは、Iterableの非同期版で、AsyncIteratorにしたがうオブジェクトを返す関数@@asyncIterator(Symbol.asyncIterator)をプロパティとして必ず持つことを示すインターフェースである。こちらもTypeScriptではそのまま次のように定義されている。await...of文、yield*式、などを使った際に暗黙的に呼ばれうる(同じく抽象操作GetIteratorを参照)。IteratorIteratorは、IteratorResultを返す関数nextをプロパティとして必ず持ち、オプションとして同じくIteratorResultを返す関数return、throwを持つことを示すインターフェースとなっている。TypeScriptでの定義は次のようになっている。TReturn>;}反復はnextを呼ぶことによって進められる。nextは引数を任意で1つとり、IteratorResultを返す。ECMAScriptの仕様には、一度doneがtrueのIteratorResultが返されたら、それ以降返されるIteratorResultのdoneはすべてtrueであるべき旨が書かれているが、一方でこの要求は強制的なものではないとも書かれている。ECMAScriptの仕様には、Iteratorはnextが引数なしで呼ばれることもあることを前提としなければならない旨の注釈も付け加えられてある。TypeScriptでのnextの引数がタプルで表現されているのはそのチェックを厳密にするためであると思われる(省略したソースコード中のコメントにそのような旨が記載されている)。returnとthrowはそれぞれIteratorに反復処理の終了やエラーによる中断を知らせるためのもので、ECMAScriptの仕様では、典型的な振る舞いはvalueで指定した値をvalueとして持つIteratorResultを返したり、eで指定した値をthrowしたりして、以降のIteratorResultのdoneをtrueにすることであるが、実際の振る舞いはIteratorがどのように実装されているかに依存するとされている。AsyncIteratorAsyncIteratorは、Iteratorの非同期版で、プロパティとしてもつ関数がすべて、IteratorResultの代わりにIteratorResultのPromiseを返すインターフェスである。TypeScriptでの定義は次のようになっている。TReturn>>;}IteratorResultイテレーターから返されるIteratorResultは、doneとvalueの二つの値をプロパティーとして持ちうるインターフェースである。doneはtrueまたはfalse、valueは任意のECMAScriptの値をとるが、存在しない可能性もある。doneがfalseまたは存在しない場合、valueの値は反復の一要素として解釈される。doneがtrueである場合、それは反復の終了を意味し、そのときのvalueはイテレーター自体の返却値として解釈される。これをTypeScriptでは次のように表現している。IteratorReturnResult<TReturn>;組み込みの反復可能オブジェクトECMAScriptで定義されている次の組み込みオブジェクトはIterableインターフェースを満たしてる。StringArrayTypedArrayMapSetそのため、これらのオブジェクトは、for...ofなどで直接反復させることができる。console.log(char)}イテレーターの反復可能性IterableIteratorECMAScriptで定義されている上記のようなIteratorを満たすオブジェクトは、そのイテレーター自身(this)を返す@@iterator(Symbol.iterator)をプロパティとして持つプロトタイプ%IteratorPrototype%を継承しているため、イテレーター自身もIterableインターフェースを満たしている。これをTypeScriptでは次のように再帰的に表現している。IterableIterator<T>;}これを使って例えばArrayのinterfaceの一部は、次のように定義されている。IterableIterator<T>;}AsyncIterableIteratorECMAScriptで定義されているAsyncIteratorを満たすオブジェクトもまた、そのイテレーター自身(this)を返す@@asyncIterator(Symbol.asyncIterator)をプロパティとして持つプロトタイプ%AsyncIteratorPrototype%を継承しているため、イテレーター自身がAsyncIterableインターフェースを満たすようになっている。これもTypeScriptでは同様に次のように再帰的に表現している。先に挙げたインターフェースを満たすようにオブジェクトを作成すれば、自身でイテレーターや反復可能オブジェクトを作成することもできる。次のコードは1から10を出力する。組み込みの反復可能オブジェクトのように、IteratorでありかつIterable、あるいはAsyncIteratorでありかつAsyncIterableであるようなイテレーターを作成するために、ECMAScriptではジェネレーター関数というものが用意されている。GeneratorFunctionGeneratorAsyncGeneratorFunctionAsyncGeneratorGeneratorFunctionは、IteratorでありかつIterableなオブジェクトGeneratorを返す関数であり、function*を使って定義される。function*を使って定義される。これらのジェネレーター関数の中では、値を反復の一要素として出力するyieldや、処理を別のジェネレーターや反復可能オブジェクトに委任するyield*が使えるため、反復処理を柔軟に記述することができる。ONE_TO_TENを定義して作成した1から10を出力するコードは、loからhiまで(両端含む)のnumberを列挙するrange関数をジェネレーター関数として定義することで、次のように書き直すことができる。console.log(i)}Generatorは、TypeScriptでは次のように定義されている。TNext>;}IterableIteratorとの違いは、returnとthrow、およびそれらの引数にあった?がついていない点で、典型的なIteratorの振る舞いとして先に述べておいた、returnの場合valueをそのまま返して終了し、throwの場合eをthrowして終了する、という既定の動作が自動で定義されるようになっている。nextに対して与えた引数は、yieldの返却値として与えられるようになっており、ジェネレーター関数内で受け取れるようになっている。function*を使って定義されるAsyncGeneratorFunctionはその非同期版で、返されるAsyncGeneratorはTypeScriptで次のように定義されている。TNext>;}これも返される値(および返される値としてあたえる値)がPromiseとなっていることを除いて、Generatorと同様である。