IT-Q

const timeout = options.timeout || 3000 と書かれていて、timeout に 0 を指定したのに 3000 になりました。なぜですか。

|| は 0 や空文字も「値が無い」とみなして右辺を使います。?? は null と undefined のときだけ右辺を使うので、timeout: 0 のような正当な値がそのまま残ります。

面接官が見ているのは|| と ?? の違い。型が合っていても値の扱いでバグになることに気づけるか。

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

  • || は 0 や空文字も「偽」として扱い、右辺に置き換える。?? にすれば null と undefined のときだけ置き換わる
    その通りです。0 や空文字が意味のある値なら ?? を使います。
  • options.timeout の型が number ではないから
    型は number で合っています。問題は || の評価の仕方です。
  • TypeScript が 0 を undefined に変換するから
    TypeScript は値を変換しません。JavaScript の || の挙動です。
  • 0 は無効な値なので、3000 になるのが正しい
    0 を「待たない」の意味で使いたいなら、それを打ち消すのはバグです。値の意味を確かめます。

模範解答

|| は、左辺が「偽とみなされる値」なら右辺を使います。偽とみなされる値には null と undefined だけでなく、0、空文字、false、NaN も含まれます。そのため timeout: 0 を渡しても、3000 に置き換わります。

?? を使うと、左辺が null か undefined のときだけ右辺を使います。0 や空文字はそのまま残ります。

  const timeout = options.timeout ?? 3000

TypeScript の型は number で合っているので、型の検査ではこのバグは見つかりません。0、空文字、false が意味を持つ値のときは、既定値の補完に || を使わない、が原則です。

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

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。