[[TypeScript]]で[[オーバーロード (TypeScript)|オーバーロード]]を実現するには以下のようにする。
1. シグニチャの異なる同じ関数==宣言==を列挙する
2. 最後にすべてのシグニチャを包含するような関数を==定義==する
```ts
// 1. シグニチャだけが異なる同じ関数名を複数宣言する
function calculate(op: "doubleSum", x: number, y: number): number;
function calculate(op: "tripleSum", x: number, y: number, z: number): number;
// 2. 最後にすべてのシグニチャを包含するような関数を定義する
function calculate(op: "doubleSum" | "tripleSum", ...args: number[]): number {
return args.reduce((a, x) => a + x);
}
calculate("doubleSum", 1, 2)
// ^? function calculate (op: "doubleSum", x: number, y: number): number (+1 overload)
calculate("tripleSum", 1, 2, 3)
// ^? function calculate (op: "tripleSum", x: number, y: number, z: number): number (+1 overload)
```
最後の`calculate`だけでもコンパイルは通るが、[[オーバーロード]]によって[[Narrowing]]を実現できる。
![[Pasted image 20220521210616.png]]
![[Pasted image 20220521210642.png]]