TypeScript中的自定义类型守卫(Custom Type Guards)是一种特殊的函数或表达式,用于在运行时检查一个值是否属于特定的类型。通过使用类型守卫,TypeScript编译器能够在特定的作用域内准确地推断出值的类型,从而提供更严格的类型检查和更智能的代码自动完成等功能。
自定义类型守卫通常通过定义一个返回值是类型谓词(type predicate)的函数来实现。类型谓词的形式为 parameterName is Type
,其中parameterName
必须是当前函数参数的一个名称。
下面是一个自定义类型守卫的例子:
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
// 自定义类型守卫
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
// 使用自定义类型守卫
function getPet(pet: Fish | Bird) {
if (isFish(pet)) {
// 在这个分支中,TypeScript知道pet是Fish类型
pet.swim();
} else {
// 在这个分支中,TypeScript知道pet是Bird类型
pet.fly();
}
}
在上面的例子中,isFish
函数是一个自定义类型守卫,它通过检查pet对象是否有swim方法来判断该对象是否为Fish类型。一旦isFish函数被调用,TypeScript编译器就能在相应的分支中准确地推断出pet的类型,从而允许我们安全地访问Fish或Bird特有的方法。