混入(Mixins)
合并。
对象混入
可以使用 ES6 的Object.assign合并多个对象,合并后对象的类型将会变成合并前对象的类型的交叉类型。
interface Name {
name: string;
}
interface Age {
age: number;
}
interface Sex {
sex: number;
}
let a: Name = { name: "张三" };
let b: Age = { age: 18 };
let c: Sex = { sex: 0 };
let obj = Object.assign(a, b, c); // 类型为let obj: Name & Age & Sex
类混入
class A {
type: boolean;
changeType(): void {
this.type = !this.type;
}
}
class B {
name: string;
getName(): string {
return this.name;
}
}
class C implements A, B {
type: boolean = false;
name: string = "张三";
changeType: () => void;
getName: () => string;
}
function mixins(curClass: any, itemClass: any[]) {
itemClass.forEach((item) => {
Object.getOwnPropertyNames(item.prototype).forEach((name) => {
// 将另一个类里的函数赋值给实现类里的函数
curClass.prototype[name] = item.prototype[name];
});
});
}
mixins(C, [A, B]);
// 然后就可以使用被实现类里的函数方法了
let c = new C();
c.changeType(); // true
item.prototype里包含了constructor、定义在类里的函数(class 中直接定义的函数将会被添加到 prototype 上)等。class Test { num: string; add() {} } Object.getOwnPropertyNames(item.prototype).forEach((name) => { console.log(name); // constructor add });