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
110
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
130
型チェック 速度改善 奮闘記⌛
tocomi
4
1.2k
CSSセレクタを戦わせてみた⚔️
tocomi
0
73
PWA x firebase x Auth0 での認証
tocomi
1
620
フロントエンド一年生がテストを考える
tocomi
1
380
Other Decks in Programming
See All in Programming
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.9k
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
380
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
200
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.8k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
500
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
えっ!!コードを読まずに開発を!?
hananouchi
0
220
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
200
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
260
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
First, design no harm
axbom
PRO
2
1.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
370
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
Making Projects Easy
brettharned
120
6.7k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
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 の裏側がちょっとだけ分かるようになった気がする💪 みなさんも、「ここってどういう原理で動いてるんだろう?」という疑問が あったら、調べてみると⾯⽩いかもしれません🙌
おわり