TypeScript 类型守卫:让你的类型系统更智能
在 TypeScript 开发中,处理联合类型时常常遇到类型不确定性:
function process(value: string | number) {
// 这里 value 可能是 string 或 number
// 直接操作会报错:value.toUpperCase()
}
类型守卫(Type Guards) 就是解决这个痛点的利器!它能在特定作用域内缩小变量类型范围,让编译器“智能”识别具体类型。
三大常用守卫方式
typeof守卫
处理基本类型时最直接:if (typeof value === "string") { value.toUpperCase(); // ✔️ 此处 value 被识别为 string }instanceof守卫
适用于类实例判断:class Cat { meow() { } } class Dog { bark() { } } function animalSound(animal: Cat | Dog) { if (animal instanceof Cat) { animal.meow(); // ✔️ } }自定义守卫函数(最强大!)
通过返回类型谓词(arg is Type)定义复杂逻辑:interface Bird { fly(): void; } interface Fish { swim(): void; } // 自定义守卫 function isBird(pet: Bird | Fish): pet is Bird { return (pet as Bird).fly !== undefined; } function move(pet: Bird | Fish) { if (isBird(pet)) { pet.fly(); // ✔️ } else { pet.swim(); // ✔️ } }
关键优势
- 自动类型推断:守卫作用域内无需手动类型断言(
as) - 编译时验证:提前拦截潜在的类型错误
- 代码更健壮:减少运行时
undefined或null导致的崩溃
最佳实践
- 优先使用
typeof/instanceof处理简单场景 - 对复杂对象结构使用自定义守卫函数
- 避免在守卫函数内做副作用操作(保持纯净)
总结:类型守卫是 TypeScript 类型系统的核心技巧之一,通过显式定义类型收缩条件,将运行时安全检查转移到编译期,显著提升代码质量和开发体验。