LoginSignup
0
0

More than 1 year has passed since last update.

【TypeScript】ユーザー定義型ガード(user-defined type guard)が必要な状況について

Posted at

ユーザー定義型ガードが必要な状況とは?

以下のコードは一見すると、そのまま使えそうだが、「TS2339: プロパティtoUpperCaseは型numberに存在しません。」となりコンパイルできない。

function isString(a: unknown): boolean {
  return typeof a === 'string'
}

function parseInput(input: string | number) {
  let fomattedInput: string
  if (isString(input)) {
    fomattedInput = input.toUpperCase(); // string型と解釈されずにエラーとなる
  }
}

isStringの中でtypeofを使って型の絞りこみが行われているものの、呼び出し元である関数parseInputのスコープには引き継がれずにコンパイラではただisStringbooleanを返しているということぐらいしか解釈できないらしい。inputstringとして解釈されないためにtoUpperCaseは使えない。この状況を回避するにはユーザー定義型ガードを使ってisStringに渡された引数がstringであることを型チェッカーに伝えてやる必要がある。

function isString(a: unknown): a is string {
  return typeof a === 'string'
}

function parseInput(input: string | number) {
  let fomattedInput: string
  if (isString(input)) {
    fomattedInput = input.toUpperCase()
  }
}

参考・引用

「プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発」
ISBN-10 ‏ : ‎ 4873119049
ISBN-13 ‏ : ‎ 978-4873119045

0
0
0

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
0
0