外部ライブラリが 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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。