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 Compiler はどのように未使用変数を検出しているのか?
Search
Kenta TSUNEMI
May 23, 2026
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScript Compiler はどのように未使用変数を検出しているのか?
TSKaigi 2026 登壇資料
https://2026.tskaigi.org/talks/72
Kenta TSUNEMI
May 23, 2026
More Decks by Kenta TSUNEMI
See All by Kenta TSUNEMI
配列にまつわる型検査をしたら思ったより大変だった話
tocomi
0
140
型チェック 速度改善 奮闘記⌛
tocomi
4
1.3k
CSSセレクタを戦わせてみた⚔️
tocomi
0
93
PWA x firebase x Auth0 での認証
tocomi
1
650
フロントエンド一年生がテストを考える
tocomi
1
390
Other Decks in Programming
See All in Programming
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.7k
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7.2k
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6.1k
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
140
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
420
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
680
Kotlinの15年とServer-Side Kotlin
n_takehata
1
190
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
130
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
0
140
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
190
No More NoSuchMethodError
exoego
1
120
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
110
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
600
How to build a perfect <img>
jonoalderson
1
6.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
550
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
550
Everyday Curiosity
cassininazir
0
390
Discover your Explorer Soul
emna__ayadi
2
1.3k
Building AI with AI
inesmontani
PRO
1
1.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Raft: Consensus for Rubyists
vanstee
143
7.8k
Technical Leadership for Architectural Decision Making
baasie
3
630
Transcript
TypeScript Compiler は どのように未使⽤変数を検出しているのか? 2026/5/23 TSKaigi 2026 つねみ@tocomi
つねみ @tocomi 🏢テックタッチ株式会社 フロントエンドエンジニア 趣味 🥸 お笑い ⚾ 野球観戦(ヤクルトファン) 🃏
ポーカー 🎮 ゲーム 🏇 競⾺ ⾃⼰紹介
つねみ @tocomi 🏢テックタッチ株式会社 フロントエンドエンジニア 趣味 🥸 お笑い(M-1グランプリ2025 1回戦敗退) ⚾ 野球観戦(ヤクルトファン)
🃏 ポーカー 🎮 ゲーム 🏇 競⾺ ⾃⼰紹介
この発表では、未使⽤変数のチェックという観点から TSC (TypeScript Compiler) の内部動作の⼀部を⾒ていきます🚀 シンプルなサンプルコードを題材にして、TSC の内部でコードがどのような データ構造に変換されてチェックが⾏われるのか順に追っていきます👀 TypeScript v6.0.3
をベースに調査しています🔍 みなさんの知的好奇⼼を満たしたり、 TSC にディープダイブするきっかけになったら嬉しいです😌 今⽇の発表について
⽬次 🔖 1. 全体像 2. 各処理の詳細 3. まとめ
⽬次 🔖 1. 全体像 2. 各処理の詳細 3. まとめ
TypeScript Compiler の構成
TypeScript Compiler の構成 Code チェック対象のソースコード AST ソースコードの構⽂を⽊構造で表した中間表 現 Symbol Table
変数‧関数‧クラスなどの宣⾔や名前解決情 報を表すものの集合 Diagnostics 構⽂エラーや型エラーなどの情報 ここに未使⽤変数の警告が含まれる! Input / Output Parser Code を構⽂構造である AST に変換する Binder AST を⾛査し、名前と宣⾔を結びつけて Symbol Table を作る Checker AST と Symbol Table を使って型の整合性を 検査する Process ※Emit は省略してます
題材とするコード
⽬次 🔖 1. 全体像 2. 各処理の詳細 3. まとめ
Parser は、ソースコード を受け取り、AST に変換する Parser の役割
AST って? Abstract Syntax Tree(抽象構⽂⽊) の略 ソースコード内の関係性を、プログラムが扱いやすい⽊構造に変換したもの TypeScript に限らず、様々な⾔語やツールで利⽤される普遍的な構造 (ただし、変換後のノードなどはツール固有)
ex) Babel, ESLint, Prettier, … AST に変換することで、コードを「⽂字列」ではなく「構造化データ」として扱 えるようになり、型チェックや未使⽤変数のチェックがやりやすくなる。 Parser の役割
Parser の役割 ソースコード AST
Binder は、AST を受け取り、Symbol Table を作る Binder の役割
Symbol? Symbol Table? Symbol とは、関数や変数、型の情報を持つオブジェクト。 名前をキーにして種類やどこで宣⾔されたかといった情報を持っている。 Symbol をスコープごとにまとめたものが Symbol Table。
使⽤されたかのフラグ(isReferenced)も Symbol が持つが、Binder の段階では フラグはすべて undefined の状態。 (JavaScript の組み込みオブジェクト Symbol とは全くの別物) Binder の役割
Binder の役割 SourceFile.locals (ファイル内のスコープ) └ 'addOne' -> Symbol(Function) FunctionDeclaration.locals (関数内のスコープ)
├ 'num' -> Symbol(FunctionScopedVariable) └ 'unused' -> Symbol(BlockScopedVariable) - スコープごとに Symbol Table が作られる - locals というフィールドに格納される - key は変数や関数、型の名前 AST Symbol Table
Checker は、AST と Symbol Table を受け取り、Diagnostics を作る Checker の役割
Diagnostics? 直訳すると「診断」。 TS Compiler がユーザーに返却する エラーや警告、情報メッセージを指す。 型エラーや未使⽤状態の警告がここに含まれている。 ex) 'unused' is
declared but its value is never read. Checker の役割
1. return ⽂で num が使われてい る! 2. Symbol Table を⾒ると関数スコー
プの引数に num が key の Symbol がある! 3. num の Symbol の isReferenced にフラグを⽴てる! Checker の役割 Checker の気持ち (実際は AST を⾒ている)
⼀⽅で、unused は宣⾔されているため Symbol Table には存在するが、使⽤さ れていないため isReferenced は undefined のまま。
そのため Diagnostics に未使⽤である 旨が登録される。 Checker の役割 Checker の気持ち (実際は AST を⾒ている)
Checker の役割 isReferenced の操作 src/compiler/utilities.ts line 11867 〜
Checker の役割 関数は呼び出されていれば使⽤されている? 関数の再帰呼び出しの場合、 呼び出されているからといって isReference フラグを⽴てるべきではない。 関数外から関数 fib()が呼び出されない限り、関数内の fib()が呼び出されることは
ないため。
Checker の役割 Symbol Table の⾛査 src/compiler/checker.ts line 44611 〜
⽬次 🔖 1. 全体像 2. 各処理の詳細 3. まとめ
まとめ 未使⽤変数チェックという切り⼝で処理を追っていくことで、 TSC の裏側がちょっとだけ分かるようになった気がする💪 みなさんも、「ここってどういう原理で動いてるんだろう?」という疑問が あったら、調べてみると⾯⽩いかもしれません🙌
おわり