【ファントムがた】
ファントム型 とは?
最終更新:
💡 データを増やさず、型で単位や状態を区別する
実行時の値として保持しない型パラメータを、コンパイル時の区別や制約に使う仕組み。単位や状態の異なる値を混同しにくくする。
📌 このページのポイント
ファントム型って、幽霊みたいな型なの?
データに現れないのに、何のために使うの?
たとえばLength<Mm>とLength<Inch>で、ミリメートルとインチの長さを区別できるよ。中の数値はどちらもf64でも、型が違えば、同じ単位だけを足すように設計できるんだ。図はRust公式の単位の例を簡略化しているよ
単位が違うまま足すとどうなるの?
同じUnit同士だけを足せるAddの実装なら、Length<Mm>とLength<Inch>の直接の加算は型不一致になるよ。ただし型を付ける前に入力した数値や、単位を換算する計算が正しいかは別の確認が必要なんだ
認証済みかどうかも型で分けられる?
状態を型で区別し、許した状態にだけ操作を提供する設計もできるよ。ただし型を付けただけでは、外部から来たトークンが本当に有効かは分からない。認証結果を確かめてから型付きの値を作るなど、実行時の検証との境目を設計する必要があるね
型パラメータを書けば、どの言語でも区別される?
言語の型の仕組みで変わるよ。TypeScriptでは、メンバーの型に使われない型パラメータだけでは構造が同じになり、区別できないことがある。RustのPhantomDataと同じ書き方や保証だと思い込まず、型が実際に制約へ効くか確認しよう
まとめ:ざっくりこれだけ覚えればOK!
「ファントム型」って出てきたら「値を増やさず型で単位や状態を区別する仕掛け」と思えばだいたいOK!
📖 おまけ:英語の意味
「Phantom Type」 = 幽霊型
💬 Phantomは幽霊。実行時の値としては現れない型パラメータが、型の検査では役に立つ、というイメージだよ