TypeScript 里 any / unknown / never 的区别和典型使用场景?
最短理解:
any:放弃类型检查(“我不管了”)unknown:暂时不知道类型,但必须先判断再用(“先验明身份”)never:不可能有值(“走不到这里”)
any
- 含义:可赋给任何类型,也可接收任何类型;基本跳过 TS 保护。
- 场景:迁移旧代码、临时兜底、第三方无类型声明时短期过渡。
- 风险:错误容易溜进运行时。
unknown
- 含义:类型安全版“未知值”;不能直接调用属性/方法,必须先缩小类型。
- 场景:接口返回不可信数据、
catch (e)、解析外部输入(JSON/表单/消息)。 - 优点:强制你做类型守卫,更安全。
never
- 含义:永远不会出现的值类型。
- 场景:
- 永不返回的函数(
throw/ 死循环) switch穷尽检查(确保联合类型每种分支都处理了)- 条件类型中表示“被过滤掉的分支”
- 永不返回的函数(
典型示例(never 做穷尽检查):
type Shape = { kind: 'circle'; r: number } | { kind: 'square'; s: number };
function area(shape: Shape) {
switch (shape.kind) {
case 'circle': return Math.PI * shape.r ** 2;
case 'square': return shape.s ** 2;
default: {
const _exhaustive: never = shape; // 新增 kind 未处理会在这里报错
return _exhaustive;
}
}
}ts实践建议:
- 默认优先
unknown,少用any。 any用在边界层并尽快收口。- 对联合类型养成
never穷尽检查习惯。