混合(Mixins)
在下面的代码中,我们展示了如何在TypeScript中模仿混合的构建方式。我们会在后面讲述它是怎么运作的。
理解这个例子
class Disposable {
isDisposed: boolean;
dispose() {
this.isDisposed = true;
}
}
class Activatable {
activate() {
this.isActive = true;
}
deactivate() {
this.isActive = false;
}
}
接着,我们将创建一个混合了这二者的类。让我们更详细地看看这是如何实现的。
为了满足我们的需求,我们要为被混合的类的成员创建替身(stand-in)属性及类型。这使得编译器在运行时可以获得这个类的成员。虽然这种记账式的做法会花费我们些时间,但之后我们就能从mixins中受益了。
// Disposable
isDisposed: boolean = false;
isActive: boolean = false;
activate: () => void;
deactivate: () => void;
我们最后还创建了一个辅助函数来帮我们完成混合的工作。它会查询并复制每个被混合的类的属性,填充实现的类中的每一个属性。
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtor.prototype[name];
})
});
}