関数のオーバーロード(シグネチャの異なるメソッド)に対応する型を考える
例えば、以下の関数の型について考える
- number を受け取った場合は string を返す
- string を受け取った場合は number を返す
この場合、どちらか一方ということからUnion型|
を使ったがなぜかエラーになってしまう
type A = (x: number) => string; type B = (x: string) => number; declare var x: A | B; x(1); // Error! x('1'); // Error!
この件について以下の記事でまとめられていた
つまり、Union型はどちらか一方を満たしていることを約束する型だが、呼び出す際に本当にどちらか一方の型が呼び出されても問題ないことを確定するため全ての型を確認してしまう
そのため、エラーになってしまうということだった
解決策
Intersection型を使うとのこと
type A = (x: number) => string; type B = (x: string) => number; declare var x: A & B; x(1); // Fine! x('1'); // Fine!
なぜなら、Intersection型は全てを満たしていることを約束しているので、呼び出す際にわざわざ全ての型を確認しにいかないため
ややこしい