12.TypeScript中的交叉类型

交叉类型(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();

利用交叉类型,我们可以方便的使用已有的类型,创建出更加丰富的类型。

其实交叉类型很好理解,各种类型有交集,那么组成的新类型一定是要满足各个类型的。

おすすめ

転載: blog.csdn.net/sinat_41212418/article/details/120815321