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 Compiler はどのように未使用変数を検出しているのか?
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kenta TSUNEMI
May 23, 2026
Programming
93
0
Share
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
120
型チェック 速度改善 奮闘記⌛
tocomi
4
1.2k
CSSセレクタを戦わせてみた⚔️
tocomi
0
69
PWA x firebase x Auth0 での認証
tocomi
1
610
フロントエンド一年生がテストを考える
tocomi
1
380
Other Decks in Programming
See All in Programming
Swiftのレキシカルスコープ管理
kntkymt
0
210
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
440
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
440
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
360
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
970
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
120
3Dシーンの圧縮
fadis
1
600
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
17
5.8k
今さら聞けないCancellationToken
htkym
0
220
The NotImplementedError Problem in Ruby
koic
1
550
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
210
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Believing is Seeing
oripsolob
1
140
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Tell your own story through comics
letsgokoyo
1
940
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Code Reviewing Like a Champion
maltzj
528
40k
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 の裏側がちょっとだけ分かるようになった気がする💪 みなさんも、「ここってどういう原理で動いてるんだろう?」という疑問が あったら、調べてみると⾯⽩いかもしれません🙌
おわり