インターセクション型 &
| 対応: | TypeScript 1.0(2014) |
|---|
「AかつB」という複数の型をすべて満たす型です。『&』(アンパサンド)で複数の型をつなげて表現し、複数のinterfaceや型エイリアスを合成した新しい型を作るために使います。
構文
// インターセクション型の定義 type 型名 = 型1 & 型2; // 複数のinterfaceを合成します。 type 型名 = InterfaceA & InterfaceB & InterfaceC;
構文一覧
| 構文 | 概要 |
|---|---|
| 型1 & 型2 | インターセクション型です。型1と型2の両方のプロパティをすべて持つ型を作ります。 |
| 複数のinterface合成 | 複数のinterfaceをインターセクション型でまとめることで、コンポーネントの組み合わせを表現できます。 |
サンプルコード
// 2つのinterfaceを合成します。
interface HasName {
name: string;
}
interface HasAge {
age: number;
}
interface HasFavoriteSong {
favoriteSong: string;
}
// HasNameとHasAgeとHasFavoriteSongの3つのプロパティを持つ型を作ります。
type Person = HasName & HasAge & HasFavoriteSong;
const person: Person = {
name: "member_1",
age: 30,
favoriteSong: "classic_rock",
};
console.log(`${person.name}: ${person.age}歳`);
// 『member_1: 30歳』と出力されます。
// 3つの型の合成: Userに権限情報とタイムスタンプを加えます。
interface User {
id: number;
name: string;
}
interface HasRole {
role: "admin" | "member";
}
interface HasTimestamp {
createdAt: Date;
updatedAt: Date;
}
type FullUser = User & HasRole & HasTimestamp;
const admin: FullUser = {
id: 1,
name: "管理者",
role: "admin",
createdAt: new Date("2024-01-01"),
updatedAt: new Date("2024-06-01"),
};
console.log(admin.role); // 『admin』と出力されます。
// 関数の引数での活用: 複数の条件を一度に要求します。
interface Loggable {
log(): void;
}
interface Serializable {
serialize(): string;
}
function process(item: Loggable & Serializable): void {
item.log();
console.log(item.serialize());
}
// プリミティブ型のインターセクションは通常never型になります。
type StringAndNumber = string & number; // never型になります。
実行すると次のように出力されます。
npx ts-node ts_intersection.ts member_1: 30歳 admin
概要
インターセクション型は『&』で複数の型を組み合わせた「すべてを満たす型」を作ります。ユニオン型が「AまたはB」であるのに対し、インターセクション型は「AかつB」を表します。結果として生成される型は、すべての元の型のプロパティをすべて持つ必要があります。
実務では、複数の役割(ロール)を持つオブジェクトを表現する際によく使われます。たとえば「ログインしているユーザー」「管理者権限を持つ」「作成日時を持つ」という3つの性質をそれぞれinterfaceで定義し、インターセクション型でまとめることで、関心の分離とコードの再利用が実現できます。
注意: 互いに矛盾するプロパティ(同名で異なる型)を持つ型を合成すると、そのプロパティは『never』型になり、値を代入できなくなります。プリミティブ型同士(string & number など)のインターセクションも同様にneverになります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。