LoginSignup
4

More than 5 years have passed since last update.

TypeScriptで「○○型かどうか」を返す関数を作る

Last updated at Posted at 2017-10-21

困りごと

引数の型が複数定義できるときに、いい感じにチェックしたいのです。

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 と呼ぶみたいです。

以上です。よろしくお願いします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4