feng xiaohan

混入(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
});