IT-Q

user?.profile?.name と書いたら、画面に「undefined さん」と表示されました。どう直しますか。

?. は途中が null か undefined なら undefined を返すだけで、値が無いことは変わりません。無いときの扱いを決め、?? で既定値を付けるか、表示を分けます。

面接官が見ているのは?. の結果に undefined が含まれることを、型と表示の両方で扱えるか。

これは「const timeout = options.timeout || 3000 と書かれていて、timeout に 0 を指定したのに 3000 になりました。なぜですか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • ?. の結果は undefined になりうるので、?? で表示用の既定値を決めるか、無い場合の表示を分ける
    その通りです。?. は落ちないようにするだけで、無いときにどうするかは決めてくれません。
  • user!.profile!.name に書き換える
    無いときに落ちるようになるだけです。無い人がいる、という事実は変わりません。
  • TypeScript が undefined を空文字に変えるはずなので、設定が間違っている
    そういう設定はありません。テンプレート文字列に undefined を入れると、そのまま文字になります。
  • name の型を string にすれば直る
    型を変えても、実際に値が無ければ undefined のままです。無いときの扱いを決める必要があります。

模範解答

?. は、途中が null か undefined なら、そこで止めて undefined を返します。落ちなくはなりますが、結果が undefined になることは変わりません。それをテンプレート文字列に入れると、「undefined」という文字がそのまま表示されます。

直し方は、無いときにどうするかを決めることです。表示用の既定値でよければ user?.profile?.name ?? "ゲスト" のように書きます。名前が無い人には別の表示をしたいなら、分岐を分けます。

型の上でも、この式の型は string | undefined になっています。?. を書いた時点で「無いかもしれない」と認めているので、その先で無い場合の扱いを決めるところまでが1つの仕事です。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。