UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【FlowType】関数オーバーロード

関数のオーバーロードシグネチャの異なるメソッド)に対応する型を考える

例えば、以下の関数の型について考える

  • 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!

この件について以下の記事でまとめられていた

qiita.com

つまり、Union型はどちらか一方を満たしていることを約束する型だが、呼び出す際に本当にどちらか一方の型が呼び出されても問題ないことを確定するため全ての型を確認してしまう

そのため、エラーになってしまうということだった

解決策

Intersection型を使うとのこと

type A = (x: number) => string;
type B = (x: string) => number;

declare var x: A & B;

x(1);   // Fine!
x('1'); // Fine!

なぜなら、Intersection型は全てを満たしていることを約束しているので、呼び出す際にわざわざ全ての型を確認しにいかないため

ややこしい