交叉类型(Intersection Types)
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。 例如, Person & Serializable & Loggable同时是 Person 和 Serializable 和 Loggable。 就是说这个类型的对象同时拥有了这三种类型的成员。
interface Person {
name: string
}
interface Serializable {
serializer(): void
}
interface Loggable {
log(): void
}
// 使用类型别名创建一个新的类型
type Itype = Person & Serializable & Loggable;
let itype: Itype = {
// error 缺少serializer属性
name: 'type',
log() {
}
};
itype = {
// ok
name: 'type',
log() {
},
serializer() {
}
}
我们大多是在混入(mixins)或其它不适合典型面向对象模型的地方看到交叉类型的使用。 (在JavaScript里发生这种情况的场合很多!) 下面是如何创建混入的一个简单例子:
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];
}
}
return result;
}
class Person {
constructor(public name: string) {
}
}
interface Loggable {
log(): void;
}
class ConsoleLogger implements Loggable {
log() {
// ...
}
}
var jim = extend(new Person("Jim"), new ConsoleLogger());
var n = jim.name;
jim.log();
利用交叉类型,我们可以方便的使用已有的类型,创建出更加丰富的类型。
其实交叉类型很好理解,各种类型有交集,那么组成的新类型一定是要满足各个类型的。