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
Kenta TSUNEMI
May 23, 2026
Programming
4
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
64
PWA x firebase x Auth0 での認証
tocomi
1
610
フロントエンド一年生がテストを考える
tocomi
1
370
Other Decks in Programming
See All in Programming
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
110
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
3.2k
【ディップ|26年新卒研修資料】TDD実装演習
dip_tech
PRO
0
190
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
390
AI Agent と正しく分析するための環境作り
yoshyum
2
530
Sans tests, vos agents ne sont pas fiables
nabondance
0
140
継続的な負荷検証を目指して
pyama86
3
1.2k
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
0
220
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
5
5.6k
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
190
AgentCore Optimizationを始めよう!
licux
3
250
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
160
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
A Soul's Torment
seathinner
6
2.8k
Un-Boring Meetings
codingconduct
0
290
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
180
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Skip the Path - Find Your Career Trail
mkilby
1
120
Unsuck your backbone
ammeep
672
58k
Raft: Consensus for Rubyists
vanstee
141
7.4k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
930
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Design in an AI World
tapps
1
210
Designing for humans not robots
tammielis
254
26k
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 の裏側がちょっとだけ分かるようになった気がする💪 みなさんも、「ここってどういう原理で動いてるんだろう?」という疑問が あったら、調べてみると⾯⽩いかもしれません🙌
おわり