題材
関数 invert
があり、入出力の型が下記の通りとする
- 入力が
string
のとき ->number
を返す - 入力が
number
のとき ->string
を返す
Overload Signature 使わないでやる
このとき、下記のように書いても動作するが
export function invert(n: number | string): string | number {
return typeof n === 'string' ? parseInt(n) : String(n)
}
この書き方の場合、関数を使う側で型のチェックが必要になる。理由は、 invert()
は string
もしくは number
を返す型と認識されるため。
Overload Signature を使うと
ここで Overload Signature の出番。
入力に応じて、どの型が返されるのかを指定することができる。
export function invert(n: string): number // <-- string の時は number を返す
export function invert(n: number): string // <-- number の時は string を返す
export function invert(n: number | string): string | number {
return typeof n === 'string' ? parseInt(n) : String(n)
}
関数に注釈をつける感じ。
今度は、 invert
呼び出し側での型チェックが不要になった。また、誤った型指定をするとエラーにもなる。
ついで
ちなみに、下記のように引数の数を変更することも可能。ちゃんと型推論してくれるTypeScriptすごい・・・