0%

混合

TypeScript只能严格的单继承,因此你不能:

1
2
3
class User extends Tagged,Timestamped {
//ERROR:不能多重继承
}

从可重用组件构建类的另一种方式是通过基类构建它们,这种方式成为混合

混合是一个函数:

  • 传入一个构造函数;
  • 创建一个带有新功能,并且扩展构造函数的新类
  • 返回这个新类

example:

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
//所有mixins都需要
type Constructor<T = {}> = new (...args: any[]) => T;
//添加属性的混合例子
function Timestamped<TBase extends Constructor>(Base: TBase) {
return class extends Base {
timestamp = Date.now()
}
}
//添加属性和方法的混合例子
function Activatable<TBase extends Constructor>(Base: TBase) {
return class extends Base {
isActivated = false;
activate() {
this.isActivated = true;
}
deactivate() {
this.isActivated = false
}
}
}
class User {
name=''
}
//添加TImestamped的User
const Timestamped = Timestamped(User)
const TimestampedActivatableUser = Timestamped(Activatable(User))
const timestampUserExample = new Timestamped()
console.log(timestampUserExample.timestamp)
const timestampedActivatableUserExample = new TimestampedActivatableUser()
console.log(timestampedActivatableUserExample.timestamp)

上面这个例子中,

创建一个构造函数

混合接受一个类,并且使用新功能扩展它,因此,我们需要定义构造函数的类型:

1
type Constructor<T = {}> = new (...args:any[]) => T

扩展一个类并且返回它:

1
2
3
4
5
6
//添加属性的混合例子
function Timestamped<TBase extends Constructor>(Base: TBase) {
return class extends Base {
timestamp = Date.now()
}
}