Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TypeScriptの言語仕様から考えるイテレータの定義
Search
ユート
December 23, 2025
22
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptの言語仕様から考えるイテレータの定義
大学のサークルでLTやったのでネットに流しとくだけ.
ユート
December 23, 2025
More Decks by ユート
See All by ユート
一包化監査のためのハイパースペクトルカメラを用いた錠剤識別可能性の検証
youto
0
0
Terraformを用いてコードからVMを作成してみる
youto
0
20
3年間勉強して辿り着いた プログラミング勉強方法
youto
0
320
モチベーション維持アプリの構想と提案
youto
0
48
GitHubの使い方
youto
0
160
天気予報アプリの開発
youto
0
67
Featured
See All Featured
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
360
Six Lessons from altMBA
skipperchong
29
4.5k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
BBQ
matthewcrist
90
10k
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