ユーザー定義型ガードが必要な状況とは?
以下のコードは一見すると、そのまま使えそうだが、「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
のスコープには引き継がれずにコンパイラではただisString
がboolean
を返しているということぐらいしか解釈できないらしい。input
がstring
として解釈されないために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