交差型(&, intersection types)は、複数の型を1つに組み合わせ、結合された型のすべてのプロパティを持つ型を作成できる仕組みです。
type Person = { name: string }; type Worker = { job: string }; type WorkingPerson = Person & Worker; // { name: string; job: string } const wp: WorkingPerson = { name: "Leo", job: "Dev" };
これは、拡張可能な契約の構成や、プリミティブから複雑な型を構築する際に便利です。
しかし、互換性のない型が交差した場合(例えば、type A = { foo: string } と type B = { foo: number })、初期化不可能な型が生成されます。
type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }
同じフィールドを持つ二つの型を交差させるとどうなりますか?
回答: フィールドは never 型になります。なぜなら、値は同時に文字列でも数字でもあり得ないからです。この型は有効に実装することができません。
type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }
ストーリー
プロジェクトで異なるライブラリの型を交差させている際、同じフィールドに異なる型があることに気づかずに進めました。その結果、予期しない「不可能」(never)型が生成され、有効なオブジェクトをAPIに渡すことができなくなりました。
ストーリー
開発者はDTO型とドメインエンティティの型を「結合」する必要がありました。交差型に互換性のないプロパティが2つ存在し、その型を使用しようとしたところ、あいまいなコンパイルエラーが発生しました。開発者は原因を理解するまでデバッグに時間を費やしました。
ストーリー
あるマイクロサービスでは、リクエストボディを記述するための交差型が宣言されていました。APIの変更により、1つのプロパティの型が異なり、新しい変更はすぐにはコンパイルエラーを引き起こさなかったのですが、デプロイ後のランタイムで問題が発生しました。