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
24
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptの言語仕様から考えるイテレータの定義
大学のサークルでLTやったのでネットに流しとくだけ.
ユート
December 23, 2025
Transcript
15 slides
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
More Decks by ユート
See All by ユート
自宅サーバはどこまで再現できるのか - Proxmox VE上のVM環境をIaCとバックアップで戻してみた
youto
0
110
自己紹介をやるよ!!
youto
0
150
Terraformを用いてコードからVMを作成してみる
youto
0
28
3年間勉強して辿り着いた プログラミング勉強方法
youto
0
330
モチベーション維持アプリの構想と提案
youto
0
53
GitHubの使い方
youto
0
170
天気予報アプリの開発
youto
0
73
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.7k
It's Worth the Effort
3n
188
29k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
560
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
620
Writing Fast Ruby
sferik
630
63k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
570