对象混入

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

合并完的对象会被TS推断为交叉类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface Name {
name: string
}
interface Age {
age: number
}
interface Gender {
gender: number
}

let a:Name = {name:"yajue"}
let b:Age = {age:24}
let c:Gender = {gender:0}

let obj = Object.assign(a,b,c) // obj的类型:Name & Age & Gender

类混入

不使用extends而是使用implements,把类当成接口

使用Object.getOwnPropertyNames可以获取对象的所有属性名(除了继承的属性),返回属性名数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class A {
type:boolean
changeType() {
this.type=!this.type
}
}

class B {
name:string
getName(): string {
return this.name
}
}

// C类是A类和B类的混合,此处只写一些占位符简单定义
class C implements A,B {
type: boolean = false
name: string = "yajue"
changeType:()=> void
getName:()=> string
}

// 帮助函数,进行混入操作
// 遍历A和B的属性和方法逐个复制给C,顶替掉原先定义的占位符
mixins(C,[A,B])
function mixins(curClas:any,itemCls:any[]) {
itemCls.forEach(item=> {
Object.getOwnPropertyNames(item.prototype).forEach(name=> {
curClas.prototype[name] = item.prototype[name]
})
})
}