TypeScript 中的类型守卫(Type Guard)是什么?如何使用?
1. 类型守卫的概念
- 类型守卫是运行时检查表达式,帮助 TypeScript 在条件分支内将宽泛类型收窄为更具体的类型
- 它是 JavaScript 动态运行时检查与 TypeScript 静态类型系统之间的桥梁
- 类型守卫本身是普通的 JavaScript 检查(typeof、instanceof 等),类型收窄是编译时的分析结果
2. 内置类型守卫
- typeof:收窄基础类型,如 typeof x === "string" 将 x 收窄为 string
- instanceof:收窄类实例类型,如 error instanceof TypeError 将 error 收窄为 TypeError
- in:检查属性是否存在,如 "swim" in animal 根据属性存在性收窄对象类型
- Array.isArray:收窄为数组类型
- 严格相等检查:x === null、x !== undefined 或比较判别字段
3. 自定义类型谓词
- 函数返回类型声明为 value is TypeName,告诉 TypeScript 当函数返回 true 时参数具有指定类型
- 例如 function isString(x: unknown): x is string { return typeof x === "string"; }
- 类型谓词将收窄逻辑封装为可复用的函数,适用于复杂的类型判断场景
4. 断言函数
- 使用 asserts 关键字,在断言失败时抛出异常,成功时收窄类型
- 例如 function assertIsString(value: unknown): asserts value is string
- 断言函数返回后,变量类型已被收窄,无需再写条件分支
5. 判别联合与穷尽检查
- 判别联合:联合类型的每个成员共享一个字面量属性(如 kind、type),通过检查该属性值进行收窄
- 在 switch 语句中,每个 case 分支自动收窄到对应的联合成员
- 使用 never 类型在 default 分支进行穷尽检查:当联合类型新增成员时,编译器会报错提示遗漏