Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScriptの言語仕様から考えるイテレータの定義
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ユート
December 23, 2025
0
12
TypeScriptの言語仕様から考えるイテレータの定義
大学のサークルでLTやったのでネットに流しとくだけ.
ユート
December 23, 2025
Tweet
Share
More Decks by ユート
See All by ユート
3年間勉強して辿り着いた プログラミング勉強方法
youto
0
290
モチベーション維持アプリの構想と提案
youto
0
34
GitHubの使い方
youto
0
130
天気予報アプリの開発
youto
0
42
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
Color Theory Basics | Prateek | Gurzu
gurzu
0
200
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
440
How to make the Groovebox
asonas
2
1.9k
Unsuck your backbone
ammeep
671
58k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
120
Game over? The fight for quality and originality in the time of robots
wayneb77
1
120
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
440
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Into the Great Unknown - MozCon
thekraken
40
2.3k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
57
Transcript
TypeScript の言語仕様から考えるイテレータの定義 December 23, 2025
▶ 目次 1 導入 2 2 つのプロトコル 3 反復可能プロトコル 4
イテレータプロトコル 5 まとめ 2 / 10
導入
▶ 導入: イテレータへの問い よくある説明 イテレータは「データ構造の中にあるデータを取り出すためのカーソル」である。 しかし、これで十分だろうか? プログラミングにおいて、すべての挙動は詳細に定義されている。 「カーソル」という抽象的な表現だけでなく、言語仕様(TypeScript)の観点から詳細を理解する必 要がある。 3
/ 10
▶ はじめに: イテレータの役割 イテレータとは データ構造の内部構造を無視して、統一的な操作で「次のデータ」を取得する仕組み。 • メリット: 利用者はデータ構造(配列, Map, Set
等)を気にせずループを書ける。 • 例: Set や Map • 「n 番目」という概念がないため、カウンタ変数 (i) ではアクセス不可。 • イテレータが「現在の参照点」を保持し、次の要素へ誘導する。 4 / 10
2 つのプロトコル
▶ イテレータを構成する 2 つのプロトコル イテレータの仕組みは、以下の 2 つのプロトコル(取り決め)によって成り立っている。 1 反復可能プロトコル (Iterable
Protocol) • 「私はループできます」と宣言するためのプロトコル。 • イテレータを生成するファクトリメソッドを定義。 2 イテレータプロトコル (Iterator Protocol) • 実際の「反復動作」を定義するプロトコル。 • 次の値をどう出すか、いつ終わるかを管理。 5 / 10
反復可能プロトコル
▶ 反復可能プロトコル (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
▶ ジェネリクス <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
イテレータプロトコル
▶ イテレータプロトコル (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
▶ 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
まとめ
▶ まとめ 1 2 つのプロトコル:「反復可能プロトコル」と「イテレータプロトコル」の連携によりループが成 立する。 2 抽象化の力: 内部構造(配列、リスト、木構造など)を気にせず、統一された Symbol.iterator
経由で操作可能。 3 型安全性: TypeScript のジェネリクスにより、イテレータの中身に対しても型推論が効き、安全な 開発が可能。 「データ構造の中身を気にせず使用できる」 この抽象化こそが、大規模アプリケーションを安全に構築する鍵となる。 10 / 10