19.TS混入(mixin)

169 阅读1分钟

混入类似于合并

1.对象混入

可以使用es6的Object.assign 合并多个对象

interface A {
  name: string
}
​
interface B {
  age: number
}
​
interface C {
  sex: string
}

const a = {
  name: 'Yang',
}
​
const b = {
  age: 24,
}
​
const c = {
  sex: '男',
}
// 此时p的类型就是一个交叉类型 既有name 也有age 又有sex
const p = Object.assign(a, b, c)
console.log(p)
​

2.类的混入

class A {
  name: string
  constructor(name: string) {
    this.name = name
  }
  changeName(name: string): void {
    this.name = name
  }
}
class B {
  age: number
  constructor(age: number) {
    this.age = age
  }
  addAge(): void {
    this.age++
  }
}
​
// 实现类 以接口的形式去混入 implements 用于接口的继承 这里把类当成接口进行混入
// 需要实现上面的方法和属性
class C implements A, B {
  name: string = 'Yang'
  age: number = 23
  changeName(): void {}
  addAge(): void {}
}
​
mixins(C, [A, B])
function mixins(currentClass: any, itemClass: any[]) {
  currentClass.forEach((item) => {
    Object.getOwnPropertyNames(item.prototype).forEach((name) => {
      currentClass.prototype[name] = item.prototype[name]
    })
  })
}
​