Typescript 使用用户定义类型保护的替代方法?

Typescript 使用用户定义类型保护的替代方法?,typescript,Typescript,我正在阅读Typescript手册中有关用户定义的类型保护的内容。假设您有一个要缩小范围的联合类型,如下所示: interface Bird{ fly(); layEggs(); } interface Fish{ swim(); layEggs(); } class SmallPet implements Fish,Bird{ constructor(){ } fly() { console.log("fly")}; swim

我正在阅读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

Typescript是否必须解析一个看起来像类型保护的函数才能实现此功能,并随后通过函数调用缩小类型?没有其他方法可以设置类型保护吗?

用户定义的类型保护有两个功能:

  • 在运行时检查值是否属于特定类型
  • 告诉编译器某个值属于某种类型
  • 如果您知道您的实例属于
    Fish
    类型,那么您可以简单地:

    (pet as Fish).swim();
    
    在您的情况下,您还可以使用
    instanceof
    类型保护:

    if (pet instanceof SmallPet) {
        pet.swim();
    }
    

    用户定义的类型保护具有两个功能:

  • 在运行时检查值是否属于特定类型
  • 告诉编译器某个值属于某种类型
  • 如果您知道您的实例属于
    Fish
    类型,那么您可以简单地:

    (pet as Fish).swim();
    
    在您的情况下,您还可以使用
    instanceof
    类型保护:

    if (pet instanceof SmallPet) {
        pet.swim();
    }
    
    警察说

    类型保护是执行运行时检查以保证某个范围内的类型的表达式

    因此,当您使用类型保护时,类型检查器将缩小当前范围的实例类型:在本例中为if块

    同样的操作也可以使用if语句中的
    petinstanceof Fish
    。类型检查器对当前范围进行同样的缩小。

    类型保护是执行运行时检查以保证某个范围内的类型的表达式

    因此,当您使用类型保护时,类型检查器将缩小当前范围的实例类型:在本例中为if块

    同样的操作也可以使用if语句中的
    petinstanceof Fish
    。类型检查器对当前范围执行相同的缩小操作