交叉类型(符号:“&”,Intersection Types):
交叉类型的作用同样是将多个类型合并叠加为一种类型来使用,叠加后的类型包含了所有类型特性。在TypeScript中有很多方案可以实现类型的扩展,如混入,继承,实现等,当我们的实际操作环境不适合面向对象来操作的时候,就应当考虑使用交叉类型来实现了。
**案例分析:**我们还是定义一个Person类作为基础,定义一个拳击的接口,我们最后要定义一个运动员,这个运动员由Person类和拳击接口叠加而成。
// Person class Person { name: string; gender: boolean; age?: number; constructor(name: string, gender: boolean, age: number) { this.name = name; this.gender = gender; this.age = age; } } 复制代码
// Boxing interface Boxing { punches(): void; } 复制代码
// sportsman const sportsman: Person & Boxing = { name: "MMA大师", gender: true, age: 35, punches: () => { console.log("出拳💪"); }, }; 复制代码
联合类型(符号:“|”,Union Types)
联合类型的应用是在我们定义一些函数的时候需要传入的参数类型并非特定,如可以传入的形参类型为string,number,boolean,这个时候我们就可以通过“|”来实现类型的联合。
class Person { name: string; gender: boolean; age?: number; constructor(name: string, gender: boolean, age: number) { this.name = name; this.gender = gender; this.age = age; } } class Animal { name: string; gender: boolean; age?: number; constructor(name: string, gender: boolean, age: number) { this.name = name; this.gender = gender; this.age = age; } } function say(arg: Person | Animal): void { console.log(arg.name, arg.gender); } 复制代码
类型保护&类型区分
上面的联合类型是当我们在需要传入多种类型的形参的定义方式,定义好后我们在实际使用的时候如何可以直接调用多种类型中相同的属性,函数,但是不同的内容要区分清楚是哪种类型所特有的。通常就是通过检测属性或函数是否存在后执行,如下:
function say(arg: Person | Animal): void { if (arg.name) { console.log(arg.name); } } 复制代码
我们来看类型断言怎么做:
function say(arg: Person | Animal): void { console.log((<Person>arg).name); console.log((<Animal>arg).name); } 复制代码
typeof类型保护:
instanceof类型保护:
function say(arg: Person | Animal): void { if (arg instanceof Person) { console.log(arg.name); } if (arg instanceof Animal) { console.log(arg.name); } }