TypeScript 中的 useUnknownInCatchVariables
说明 useUnknownInCatchVariables 为什么把 catch 变量默认从 any 变成 unknown,以及它如何推动更明确的错误收窄。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: TypeScript MOC
- 配置入口: tsconfig 使用详解
- 并列概念: TypeScript 中的 strict, TypeScript 类型检查, TypeScript 中的 unknown 与 any
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 明确说明:
- 这个选项在
strictfamily 下会自动开启
所以很多项目是在升级严格模式后才第一次碰到它。
需要时仍可在单个 catch 里显式退回 any
例如:
catch (err: any) {
console.log(err.message);
}
这是一种局部 opt-out。
参考信息
- TSConfig
useUnknownInCatchVariables: https://www.typescriptlang.org/tsconfig/useUnknownInCatchVariables.html - TypeScript 4.4 Release Notes: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html