問題のコード
const test = (): string | undefined => {
return "hello"
}
if (test() !== undefined){
test().length // エラー
}
プロパティシグネチャがundefined
を含みますが、
メソッド自体は必ずstring
を返しますし、
if
文の前にundefined
のチェックも行っています。
それなのになぜエラーが出るのでしょうか?
なぜこうなる?
これは、型の絞り込みは、変数にしか行われないためです。
メソッドの返り値は、型の絞り込みには使用できません。
以下のように変更してみたらどうでしょうか?
let cnt = 0
const test = (): string | undefined => {
if (cnt > 1){
return undefined
}
cnt = cnt + 1
return "hello"
}
if (test() !== undefined){
test().length // エラー
}
このコードを型チェックを無効にして実際に動かしてみると、
実行時にエラーが発生します。
これは、test()
が副作用を持つメソッドであり、呼ぶために実行結果が変わるためです。
これでは型の絞り込みが意味がありません。
どうする?
型の絞り込みは変数にしか効きません。
なので、実行結果を変数に入れてやります。
const test = (): string | undefined => {
return "hello"
}
const testResult = test() // ここではまだundefinedの絞り込みはされてない
if (testResult !== undefined){ // ここでundefinedの可能性を除外
testResult.length // 5
}
これで無事に通ります。