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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kenta TSUNEMI
May 23, 2026
Programming
130
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
83
PWA x firebase x Auth0 での認証
tocomi
1
640
フロントエンド一年生がテストを考える
tocomi
1
390
Other Decks in Programming
See All in Programming
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
130
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
470
Simple Storage Service(S3) is not simple
iwatsukayura
0
210
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
Domain-Driven Transformation
hschwentner
2
2.3k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
120
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.2k
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
110
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
450
すこし踏み込む CancellationToken
htkym
2
1.6k
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Designing for humans not robots
tammielis
254
26k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Cult of Friendly URLs
andyhume
79
7k
We Are The Robots
honzajavorek
0
390
Speed Design
sergeychernyshev
33
2.1k
Optimizing for Happiness
mojombo
378
71k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
740
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
30 Presentation Tips
portentint
PRO
1
420
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 の裏側がちょっとだけ分かるようになった気がする💪 みなさんも、「ここってどういう原理で動いてるんだろう?」という疑問が あったら、調べてみると⾯⽩いかもしれません🙌
おわり