【问题标题】:A typescript question to implement runtime inheritance一个实现运行时继承的打字稿问题
【发布时间】:2020-04-17 05:29:28
【问题描述】:

我看到一个关于打字稿的问题。问题是:

通过JS实现构造函数,保证“magicMike”具备“mike”的能力。

declare interface Book {};

declare interface BookOfSpells extends Book {};

declare class Career {};

class Wizzard<c extends Career> {
  spellBooks: Array<BookOfSpells>;
  public castSpell() {}
  constructor(career: c) {

    // Complement code

  }
}

class Engineer extends Career {
  public buildBabel() {}
}

const mike = new Engineer();

// Complement code

const magicMike = new Wizzard(mike);

// Achieve:

magicMike.buildBabel();

我有一些想法,但没有一个是最好的解决方案。如何解决这个问题?谢谢!

【问题讨论】:

    标签: javascript typescript oop inheritance


    【解决方案1】:

    我们在 typescript 中最接近多重继承的是mixins,它是接受一个类并返回一个修改后的类的高阶函数。除了将Wizard 定义为一个类之外,我们还可以将其定义为一个可以修改任何Career 类的mixin。

    const applyWizardry = <TBase extends Constructor<Career>>(Base: TBase) => {
        return class extends Base {
            spellBooks: Array<BookOfSpells> = [];
            public castSpell() {}
    
            constructor(...args: any[]) {
                // call parent constructor
                super(...args);
    
                // wizard constructor stuff
            }
        }
    }
    

    我们可以分两步创建magicMike

    const MagicEngineer = applyWizardry(Engineer);
    const magicMike = new MagicEngineer();
    

    或合二为一:

    const magicMike = new (applyWizardry(Engineer))();
    

    现在 Mike 可以直接从 applyWizardry mixin 和 Engineer 类中调用方法:

    magicMike.buildBabel();
    magicMike.castSpell();
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2017-12-04
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2021-04-26
      相关资源
      最近更新 更多