TypeScript 中的 useUnknownInCatchVariables

说明 useUnknownInCatchVariables 为什么把 catch 变量默认从 any 变成 unknown,以及它如何推动更明确的错误收窄。

#tech / dev #resource / typescript #type / concept #status / growing

[!info] related notes

TypeScript 中的 useUnknownInCatchVariables

一句话定义

useUnknownInCatchVariables 会把 catch (err) 里的错误变量默认从 any 改成 unknown

核心机制 / 工作原理

官方文档说明,TypeScript 4.0 开始已经支持手写:

catch (err: unknown)

而这个选项的作用,就是让你不必每次手写 : unknown

例如:

{
  "compilerOptions": {
    "useUnknownInCatchVariables": true
  }
}

之后:

try {
  // ...
} catch (err) {
  if (err instanceof Error) {
    console.log(err.message);
  }
}

就会要求你先做收窄,再访问 message 之类的属性。

最小例子 / 最小场景

它最核心的价值是推动这件事:

  • 不预设任何被抛出的东西一定是 Error

因为 JavaScript 里真的可能抛出:

  • 字符串
  • 对象
  • 任意值

边界与易混淆点

它不是“让 catch 更麻烦”,而是让错误模型更真实

官方文档强调,这会让错误处理代码更完整,因为你不能预先保证 thrown value 一定是 Error 的子类。

它经常和 strict 一起出现

TypeScript 4.4 release notes 明确说明:

  • 这个选项在 strict family 下会自动开启

所以很多项目是在升级严格模式后才第一次碰到它。

需要时仍可在单个 catch 里显式退回 any

例如:

catch (err: any) {
  console.log(err.message);
}

这是一种局部 opt-out。

参考信息

创建于 2026/5/15 更新于 2026/5/27