【ファントムがた】

ファントム型 とは?

💡 幽霊のように見えない型が、バグを成仏させる
📌 このページのポイント
ファントム型 — 型パラメータは実行時に消える コンパイル時 実行時 Token<Authenticated> 型パラメータ: Authenticated Token<Anonymous> 型パラメータ: Anonymous { value: string } 型パラメータなし(同一) fetchUserData( token ) Anonymous → コンパイルエラー fetchUserData( token ) Authenticated → OK
型パラメータはコンパイル時のみ存在し、実行時には消える
ひよこ ひよこ

ファントム型って、幽霊みたいな型なの?

ペンギン先生 ペンギン先生

いい直感だよ!型パラメータとして宣言はされているけど、実行時のデータには現れない型のことだよ。

ひよこ ひよこ

データに現れないのに、何のために使うの?

ペンギン先生 ペンギン先生

コンパイル時に「状態」を区別するためだよ。たとえば `Token<Authenticated>` と `Token<Anonymous>` は実行時には同じ構造でも、型で区別することで認証済みトークンにしかできない操作を制限できるんだ。

ひよこ ひよこ

じゃあ間違えてAnonymousのトークンで機密データを取ろうとしたらどうなるの?

ペンギン先生 ペンギン先生

コンパイルエラーになるよ!実行すら試みる前に弾かれるから、実行時のチェックが要らなくなるんだ。

ひよこ ひよこ

それって速度面でもうれしいね!

ペンギン先生 ペンギン先生

そう、ゼロコスト抽象化と呼ばれる考え方だよ。RustHaskellTypeScriptなどで使われていて、実行時に余分なコストをかけずに安全性を保証できるんだ。

ひよこ ひよこ

どんな場面で特に役立つの?

ペンギン先生 ペンギン先生

データベース接続の「接続前・接続済み・クローズ済み」、ファイルの「読み取り専用・書き込み可能」など、状態遷移を型で強制したいときに最高に輝くよ。コンパイラが状態機械のバグを全部見つけてくれるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ファントム型」って出てきたら「実行時には消えるけどコンパイル時に状態を守る型の仕掛け」と思えればだいたいOK!
📖 おまけ:英語の意味
「Phantom Type」 = 幽霊型
💬 "Phantom(幽霊)"は「実際には存在しない」という意味。データとして存在しないが型システムには見える型パラメータだよ。
← 用語集にもどる