混合(Mixins)

    在下面的代码中,我们展示了如何在TypeScript中模仿混合的构建方式。我们会在后面讲述它是怎么运作的。

    理解这个例子

    1. class Disposable {
    2. isDisposed: boolean;
    3. dispose() {
    4. this.isDisposed = true;
    5. }
    6. }
    7. class Activatable {
    8. activate() {
    9. this.isActive = true;
    10. }
    11. deactivate() {
    12. this.isActive = false;
    13. }
    14. }

    接着,我们将创建一个混合了这二者的类。让我们更详细地看看这是如何实现的。

    为了满足我们的需求,我们要为被混合的类的成员创建替身(stand-in)属性及类型。这使得编译器在运行时可以获得这个类的成员。虽然这种记账式的做法会花费我们些时间,但之后我们就能从mixins中受益了。

    1. // Disposable
    2. isDisposed: boolean = false;
    3. isActive: boolean = false;
    4. activate: () => void;
    5. deactivate: () => void;

    我们最后还创建了一个辅助函数来帮我们完成混合的工作。它会查询并复制每个被混合的类的属性,填充实现的类中的每一个属性。

    1. function applyMixins(derivedCtor: any, baseCtors: any[]) {
    2. baseCtors.forEach(baseCtor => {
    3. Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
    4. derivedCtor.prototype[name] = baseCtor.prototype[name];
    5. })
    6. });
    7. }