TypeScript で catch の「Object is of type 'unknown'」が解決できない
TypeScript 4.4 以降は useUnknownInCatchVariables(strict で既定有効)により catch の変数が unknown 型になる。
現行版は TS18046「'e' is of type 'unknown'」、旧版は TS2571「Object is of type 'unknown'」として出る。
instanceof や型ガードで絞ってからアクセスする。
公開: 更新:
要約
Object is of type 'unknown'. が catch ブロックで出るのは、TypeScript 4.4 以降の useUnknownInCatchVariables(strict: true で既定有効)により、catch (e) の e が any ではなく unknown 型になったため。unknown はそのままでは何もできないので、型を絞ってから 使う。
これは安全側に倒した正しい挙動で、握り潰さず対処する。
エラー文言はバージョンで変わる: 同じ原因でも、現行の TypeScript(5.x 系など)で
catch変数を絞らずに使うとerror TS18046: 'e' is of type 'unknown'.(eは変数名)が出る。
それ以前のバージョンや「unknown値へのプロパティアクセス全般」ではerror TS2571: Object is of type 'unknown'.と表示される。どちらもunknownを絞っていないことが原因で、対処は同じ。
この記事下部の「## 実行例」は TypeScript 5.9 での実測のためTS18046を記録している。
よくある原因
- strict 既定:
strict: trueに連動してuseUnknownInCatchVariablesが有効になっている - 未ナローイングのアクセス:
catch (e) { console.log(e.message) }と直接プロパティを読んでいる - reject 値の前提:
Promiseの reject やthrowされる値をany前提のコードで扱っている - 旧コードの移行: 4.4 より前に書かれた古い例外処理コードをそのまま移している
解決策
1. instanceof で絞る
try {
doWork();
} catch (e) {
if (e instanceof Error) {
console.error(e.message);
} else {
console.error(String(e));
}
}Error 以外が throw される可能性も String(e) で受ければ漏れない。
2. 型ガード関数で検証する
function hasMessage(e: unknown): e is { message: string } {
return typeof e === "object" && e !== null && "message" in e;
}
try {
doWork();
} catch (e) {
if (hasMessage(e)) console.error(e.message);
}e is { message: string } の述語型で、必要な形だけを安全に取り出す。
3. any の多用を避ける
個別に catch (e: any) と書くこともできるが、型安全をその場で捨てることになる。
例外処理こそ未知の値が来る場所なので、unknown を絞る方針を基本にする。
詳しい背景は TypeScript 4.4 リリースノート(新しいタブで開く) を参照。
4. 移行期だけ設定で戻す
{
"compilerOptions": {
"useUnknownInCatchVariables": false
}
}大量の旧 catch を一度に直せないときの一時退避。
各オプションの意味は tsconfig の useUnknownInCatchVariables(新しいタブで開く) にある。
最終的には unknown を絞る形へ寄せる。
実行例
実際に上記の手順を node:20 環境で動かすと、useUnknownInCatchVariables が有効な状態の src/bad.ts で TS18046: 'e' is of type 'unknown'. が発生し(終了コード 2)、instanceof Error による絞り込みおよび型ガード関数による絞り込みのいずれもコンパイルエラーなし(終了コード 0)で通過することが確認できる。
Version 5.9.3$ npx tsc
src/bad.ts(8,17): error TS18046: 'e' is of type 'unknown'.
tsc 終了コード: 2$ npx tsc
tsc 終了コード: 0$ npx tsc
tsc 終了コード: 0— 2026-08-02 時点の出力