string | number 型の引数を受け取って、文字列のときだけ toUpperCase() を呼びたい。どうしますか。
typeof x === "string" で確かめると、その if の中では x が string として扱われます。instanceof や in、=== でも絞り込まれます。as で断言するのは確かめていない書き方です。
面接官が見ているのは型の絞り込み(narrowing)の基本。
よくある答えと、面談でどう見られるか
- typeof x === "string" で確かめてから呼ぶ
その if の中では x が string に絞り込まれます。これが基本の形です。 - (x as string).toUpperCase() と書く
数値が来ても検査を通してしまい、実行時に落ちます。確かめずに断言しています。 - x.toUpperCase?.() と書く
数値なら呼ばれないので落ちはしませんが、型エラーは消えません。意図も読み取りにくくなります。 - 引数の型を any にする
エラーは消えますが、検査を捨てています。数値が来たら実行時に落ちます。
模範解答
typeof で確かめてから呼びます。
if (typeof x === "string") {
x.toUpperCase() // ここでは x は string
}TypeScript は if の条件を読んで、そのブロックの中では x を string として扱います。これを絞り込み(narrowing)と呼びます。typeof のほかに、instanceof、"prop" in obj、=== による比較でも絞り込まれます。
as で「これは string だ」と断言するのは、確かめていないのに検査を通す書き方です。間違っていても TypeScript は止めてくれません。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。