【ファントムがた】

ファントム型 とは?

公開:
💡 幽霊のように見えない型が、バグを成仏させる
📌 このページのポイント
ファントム型 — 型パラメータは実行時に消える コンパイル時 実行時 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(幽霊)"は「実際には存在しない」という意味。データとして存在しないが型システムには見える型パラメータだよ。
← 用語集にもどる