[[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]]