Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TypeScriptの言語仕様から考えるイテレータの定義

Avatar for ユート ユート
December 23, 2025
12

 TypeScriptの言語仕様から考えるイテレータの定義

大学のサークルでLTやったのでネットに流しとくだけ.

Avatar for ユート

ユート

December 23, 2025
Tweet

Transcript

  1. ▶ 目次 1 導入 2 2 つのプロトコル 3 反復可能プロトコル 4

    イテレータプロトコル 5 まとめ 2 / 10
  2. ▶ はじめに: イテレータの役割 イテレータとは データ構造の内部構造を無視して、統一的な操作で「次のデータ」を取得する仕組み。 • メリット: 利用者はデータ構造(配列, Map, Set

    等)を気にせずループを書ける。 • 例: Set や Map • 「n 番目」という概念がないため、カウンタ変数 (i) ではアクセス不可。 • イテレータが「現在の参照点」を保持し、次の要素へ誘導する。 4 / 10
  3. ▶ イテレータを構成する 2 つのプロトコル イテレータの仕組みは、以下の 2 つのプロトコル(取り決め)によって成り立っている。 1 反復可能プロトコル (Iterable

    Protocol) • 「私はループできます」と宣言するためのプロトコル。 • イテレータを生成するファクトリメソッドを定義。 2 イテレータプロトコル (Iterator Protocol) • 実際の「反復動作」を定義するプロトコル。 • 次の値をどう出すか、いつ終わるかを管理。 5 / 10
  4. ▶ 反復可能プロトコル (Iterable Protocol) オブジェクトに「反復動作」を定義・カスタマイズさせるための契約。 • for...of ループは「次のデータをください」と要求するだけ。 • 「順序」や「終了」のルールはオブジェクト側が持つ必要がある。

    Listing 1: Iterable の定義 1 // この「契約」を満たすことが、プロパティの定義である 2 interface Iterable<T> { 3 // 1. キーは Symbol.iterator 4 // 2. 値は「引数なし」で「Iterator」を返す関数 5 [Symbol.iterator](): Iterator<T>; 6 } 6 / 10
  5. ▶ ジェネリクス <T> と型推論 型引数 <T> の役割 <T> はジェネリクスであり、ループで取り出されるデータの型を表す。 TypeScript

    はこの定義のおかげで、ループ変数の型を自動推論できる。 Listing 2: 型推論の例 1 // Iterator<string> と定義されている場合 2 for (const value of object) { 3 // value は自動的に string 型と推論される 4 console.log(value.toUpperCase()); // 安全に実行可能 5 } 7 / 10
  6. ▶ イテレータプロトコル (Iterator Protocol) 「実際にどう動くか」を定義する法律。 Listing 3: iterator の定義 1

    interface Iterator<T> { 2 next(...args: any[]): IteratorResult<T>; 3 return?(value?: any): IteratorResult<T>; 4 throw?(e?: any): IteratorResult<T>; 5 } • next() 次の値を生成する(必須) 。 • return() 途中で中断する場合に呼ばれる。 • throw() イテレータ内部にエラーを報告する。 8 / 10
  7. ▶ IteratorResult インターフェース next() メソッドの戻り値は、必ず以下の形式である。 Listing 4: IteratorResult 1 type

    IteratorResult<T> = 2 | { done: false; value: T } // 続きがある 3 | { done: true; value: undefined }// 終了 パターン A: 継続 • done: false • value: "Apple" • 「まだ終わりじゃないです」 パターン B: 終了 • done: true • value: undefined • 「もう空っぽです」 9 / 10
  8. ▶ まとめ 1 2 つのプロトコル:「反復可能プロトコル」と「イテレータプロトコル」の連携によりループが成 立する。 2 抽象化の力: 内部構造(配列、リスト、木構造など)を気にせず、統一された Symbol.iterator

    経由で操作可能。 3 型安全性: TypeScript のジェネリクスにより、イテレータの中身に対しても型推論が効き、安全な 開発が可能。 「データ構造の中身を気にせず使用できる」 この抽象化こそが、大規模アプリケーションを安全に構築する鍵となる。 10 / 10