TL;DR
& 演算子で既存の型を組み合わせ、それらすべてのメンバを持つ新しい型を作る TypeScript の構文である。主にオブジェクトの型を組み合わせるのに使う。
仕組み
Effective TypeScript 第2版 ―型システムの力を最大限に引き出す83項目 によると、型を値の集合として捉えると、A & B は積集合を表す。そのため A & B には、A と B の両方のプロパティを持つ値が属する。
例
interface Colorful {
color: string
}
interface Circle {
radius: number
}
type ColorfulCircle = Colorful & Circle
function draw(circle: ColorfulCircle) {
console.log(`Color was ${circle.color}`)
console.log(`Radius was ${circle.radius}`)
}
draw({ color: "blue", radius: 42 }) // OK注意点
interface の extends と似ているが、同じ名前のプロパティの型がぶつかったときの扱いが違う。interface では互換性のないプロパティはエラーになる。インターセクション型ではエラーにならず、両方の型を同時に満たす型として扱われる。name: string と name: number を組み合わせると、name は never 型になる。
interface Person1 {
name: string
}
interface Person2 {
name: number
}
type Staff = Person1 & Person2
// Staff の name は never 型になるEffective TypeScript 第2版 項目78 では、型の書き方もコンパイラの速さに影響するので、type のインターセクションではなく interface の extends を使うよう勧めている。