我正在阅读Typescript手册中的用户定义类型防护 . 假设您有一个要缩小的联合类型,如下所示:
interface Bird{
fly();
layEggs();
}
interface Fish{
swim();
layEggs();
}
class SmallPet implements Fish,Bird{
constructor(){
}
fly() { console.log("fly")};
swim() { console.log("swim")};
layEggs() {console.log("laying eggs") };
}
function getSmallPet(): Fish | Bird{
return new SmallPet();
}
function isFish(pet: Fish | Bird): pet is Fish{
return (<Fish>pet).swim !== undefined;
}
let pet = getSmallPet();
if (isFish(pet))
pet.swim(); //works
功能isFish是手册中提到的用户定义类型保护 . 我的问题是这是如何工作的?我试图以更草率的方式实现相同的结果,这显然不会起作用:
pet is Fish;
pet.swim(); //doesn't work
Typescript是否必须解析看起来像类型保护的函数来实现此功能,然后通过函数调用缩小类型?有没有其他方法可以拥有护卫?
2 回答
用户定义的类型保护有两个功能:
在运行时检查某个值是否属于某种类型
告诉编译器某个值是某种类型
如果您知道您的实例是
Fish
类型,那么您可以简单地:在您的情况下,您也可以使用
instanceof
型警卫:guide说
因此,当您使用类型保护时,类型检查器将缩小当前范围的实例类型:在这种情况下为if块
可以使用if语句中的
pet instanceof Fish
完成相同的操作 . 类型检查器对当前范围执行相同类型的缩小 .