使用用户定义的类型保护的其他方法?

时间:2017-02-09 10:42:13

标签: typescript

我正在阅读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 个答案:

答案 0 :(得分:1)

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

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

    (pet as Fish).swim();
    

    在您的情况下,您还可以使用instanceof类型后卫:

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

答案 1 :(得分:1)

guide

  

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

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

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