IT-Q

function isString(x: unknown): x is string のような型述語(type predicate)は、何をするものですか。

戻り値の型の位置に x is string と書くと、関数が true を返したとき、呼び出し側でその値を string として扱わせます。実際に確かめるのは関数の中のコードです。

面接官が見ているのは補強。型述語が呼び出し側の絞り込みに使われることを知っているか。

これは「const scores = ids.map((id) => scoreMap.get(id)).filter((s) => !!s) と書いたのに、scores が (number | undefined)[] のままで、合計を出すところでエラーになります。どうしますか。」への追撃質問です。

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

  • 関数が true を返したら、呼び出し側でその値を指定した型として扱わせる
    その通りです。if (isString(x)) の中で x が string になります。
  • 実行時に引数の型を確かめてくれる
    確かめるのは関数の中のコードです。型述語は、その結果を TypeScript に伝えるだけです。
  • 戻り値の型を string にする
    戻り値は boolean です。x is string は、true のときの x の型を伝えます。
  • 引数に string 以外を渡すとコンパイルエラーにする
    引数は unknown なので何でも渡せます。渡した後の絞り込みに使われます。

模範解答

戻り値の型の位置に x is string と書くと、その関数が true を返したとき、呼び出し側で x を string として扱わせます。

  if (isString(value)) {
    value.toUpperCase() // ここでは string
  }

関数自体は boolean を返すだけで、実際に確かめるのは中に書いたコードです。TypeScript は中身が正しいかを確かめないので、判定が甘ければ間違った型で通ります。

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