0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【TypeScript】メソッドの返り値が undefined である可能性を含む場合、型の絞り込みが効かない

Posted at

問題のコード

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
}

これで無事に通ります。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?