TL;DR

同じ名前の関数を、異なる引数の型や数で呼び出せるようにする仕組み。TypeScript では、複数のオーバーロードシグネチャを書き、その後に関数の本体を書く。

仕組み

TypeScript Handbook によると、オーバーロードした関数は、通常 2 つ以上のオーバーロードシグネチャと、1 つの実装シグネチャからなる。実装シグネチャは外からは見えず、呼び出し側が使えるのはオーバーロードシグネチャだけである。実装シグネチャは、すべてのオーバーロードと互換でなければならない。

例

function makeDate(timestamp: number): Date
function makeDate(m: number, d: number, y: number): Date
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {
  if (d !== undefined && y !== undefined) {
    return new Date(y, mOrTimestamp, d)
  } else {
    return new Date(mOrTimestamp)
  }
}
 
makeDate(12345678) // OK
makeDate(5, 5, 5) // OK
makeDate(1, 3) // Error: No overload expects 2 arguments...

注意点

オーバーロードは、ユニオン型の引数をどのシグネチャにも当てはめられない。TypeScript Handbook は、できるだけオーバーロードより、ユニオン型の引数を使うよう勧めている。

Effective TypeScript では、戻り値の型が引数の型によって変わる場合も、オーバーロードより条件型を優先するとしている。条件型はユニオン型に分配されるので、ユニオン型の引数も扱える。

関連

出典