TS:高级类型
1. 交叉类型
-
交叉类型是将多个类型合并为一个类型,使得这个类型包含了所有类型的特性。
-
大多数是在混入
mixins
或者其他不适合典型面向对象模型的地方看到交叉类型的使用。function extend<T,U>(first: T,second: U):T & U{ let result = <T & U>{ }; for (let id in first) (<any>result)[id] = (<any>first)[id]; for (let id in second) if(!result.hasOwnProperty(id)) (<any>result)[id] = (<any>second)[id]; } class Person { constructor(public name : string){ } } interface Loggable { log() : void; } class Logger implements Loggable{ log() { // aaaaaaaaa } } let mix = extend(new Person("yivi"),new Logger()); console.log(mix.name); mix.log();
2. 联合类型
-
联合类型作用类似于逻辑操作符——“或”,同样用“|”来分割每个类型。
-
如果一个值为联合类型,我们只能访问该联合类型的所有类型的公有成员。
interface Bird { fly(); layEggs(); } interface Fish { swim(); layEggs(); } function getAnimal() : Fish | Bird{ // do something } let pet = getAnimal(); pet.layEggs(); // ok pet.swim(); //error
-
类型保护与区分类型:当我们想要知道联合类型的确切类型是不是Fish时,可以使用类型断言进行判断;
let pet = getAnimal(); if((<Fish>pet).swim){ (<Fish>pet).swim(); }else{ (<Bird>pet).fly(); }
3. 自定义类型保护
-
所谓类型保护,就是一些表达式,他们会在运行时检查以确保在某个作用域的类型。
-
定义一个类型保护,我们只要简单地定义一个函数,返回值类型是一个类型谓词。
-
谓词为
parameterName is Type
这种形式,parameterName
必须是来自于当前函数签名里的一个参数名。function isFish(pet : Fish | Bird) : pet is Fish { return (<Fish>pet).swim != undefined