TypeScript只能严格的单继承,因此你不能:
1 2 3
| class User extends Tagged,Timestamped { }
|
从可重用组件构建类的另一种方式是通过基类构建它们,这种方式成为混合
混合是一个函数:
- 传入一个构造函数;
- 创建一个带有新功能,并且扩展构造函数的新类
- 返回这个新类
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
| 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='' }
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() } }
|