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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
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