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 を使うよう勧めている。

関連

出典