TypeScript 中的 any、unknown、never 类型分别适用于什么场景?
1. any 类型
- 表示任意类型,赋值给 any 后不再进行类型检查,等同于退出类型系统
- 适用于:从 JavaScript 迁移代码时的过渡期、与无类型定义的第三方库交互、确实无法确定类型的动态场景
- 风险:any 会"传染",对 any 类型的操作结果仍是 any,容易引入运行时错误
2. unknown 类型
- 类型安全的"顶级类型",可以接受任何值,但在使用前必须进行类型收窄
- 适用于:处理外部输入(API 响应、用户输入、JSON 解析结果)、catch 块中的错误对象
- 与 any 的核心区别:unknown 强制开发者在使用前证明值的类型,保留了类型安全
3. never 类型
- 表示"永远不会发生"的类型,没有任何值属于 never
- 适用于:
- 永远抛出异常或进入无限循环的函数返回类型
- 穷尽检查(exhaustiveness check):在 switch 语句的 default 分支中将判别字段赋值给 never 类型变量,确保所有情况都被处理
- 空联合类型和空交叉类型的结果
4. 使用建议
- 优先使用 unknown 替代 any,在类型边界处进行收窄
- 在 catch 块中,错误对象默认为 unknown 类型(useUnknownInCatchVariables 选项)
- 使用 never 进行穷尽检查,当联合类型新增成员时,编译器会报错提示遗漏的分支