困りごと
引数の型が複数定義できるときに、いい感じにチェックしたいのです。
function isNumber(arg: any): boolean {
return typeof arg === "number";
}
function isString(arg: any): boolean {
return typeof arg === "string";
}
function getInt(arg: number | string): number {
let num: number = 0;
if (isNumber(arg)) {
num = arg; // argはnumber or stringなので、number型の変数に代入することはできない
} else if (isString(arg)) {
num = parseInt(arg, 10); // argはnumber or stringなので、string型の引数として渡すことはできない
}
return 0;
}
上記のようなコードでは、number型にstring型かもしれない変数を代入しようとして怒られます。
isNumberという俺関数でチェックしているにもかかわらず・・・です。
人間がコードを読めば、isNumber
の中でnumber型かどうかをチェック、isString
でstring型かをチェックしているので、きちんと動作しそうなコードですが、TypeScriptでは怒られるのです。
代わりに、以下のように書けばきちんと通ります。
if (typeof arg === "number") {
num = arg; // OK!!!
}
いい感じに型チェックする方法
イコールを三つも書きたくない!!!というみなさんに朗報です。
booleanを返す時に、「○○型かどうか」という情報を返すことができるのです。
function isNumber(arg: any): arg is number {
return typeof arg === "number";
}
Type guard
と呼ぶみたいです。
以上です。よろしくお願いします。