2017-02-09 42 views
0

我正在阅读Typescript手册中的User-Defined Type Guards。假设你有要缩小如下的联合类型:替代方法使用用户定义的类型警卫?

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 

不打字稿已经解析,看起来像一个后卫类型的函数来实现该功能,然后缩小范围函数调用的类型?有没有其他的方式来保护警卫队?

回答

1

用户定义类型卫士有两个功能:

  1. 检查在运行时的值是否是某种类型的
  2. 告诉编译器的值是某种类型的

如果你知道你的实例是Fish型,那么你可以简单地:

(pet as Fish).swim(); 

而在你的情况,你也可以使用instanceof型后卫:

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

guide

A型后卫是一些表达式执行运行时检查,保证在一定范围内的类型。

所以,当你使用类型控卫,类型检查器将缩小实例的当前作用域类型:if块在这种情况下

相同的操作可以在如果使用pet instanceof Fish完成声明。类型检查器对当前范围进行相同类型的缩小。