IT-Q

外部ライブラリが throw "timeout" のように文字列を投げてきます。エラーの扱いを揃えるには、どうしますか。

catch したところで、Error でなければ new Error(String(e)) で包む関数を通します。その先は常に Error として扱えます。catch の変数に付けられる型注釈は any か unknown だけです。

面接官が見ているのはunknown なエラーを、扱いやすい形に正規化できるか。

これは「catch (e) の中で e.message と書いたら、「e は unknown 型です」とエラーになりました。どう直しますか。」への追撃質問です。

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

  • catch したら、Error でなければ new Error(String(e)) で包むなど、Error に揃える関数を通す
    その通りです。1か所で揃えておけば、その先は Error として扱えます。
  • すべての catch で、型ごとに分岐を書く
    正しく動きますが、同じ分岐があちこちに散ります。揃える処理は1か所にまとめます。
  • ライブラリに文字列を投げないよう頼み、それまで放っておく
    直るまでの間、文字列が来たときに落ちます。自分の側で受け止める必要があります。
  • エラーの型を string | Error と宣言する
    catch の変数に型注釈で具体的な型は付けられません(any か unknown のみ)。実行時に確かめる必要があります。

模範解答

catch したところで、Error に揃える関数を通します。

  function toError(e: unknown): Error {
    return e instanceof Error ? e : new Error(String(e))
  }

こうしておけば、その先は常に Error として message や stack を扱えます。元の値が何だったかも、String(e) で message に残ります。

catch の変数に付けられる型注釈は any か unknown だけで、string | Error のような型は付けられません。何が投げられるかは実行してみないと分からないので、確かめて揃えるしかありません。

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