模仿多重继承

Imitate multiple inheritance

有一个classFirst和构造函数Second。我正在尝试创建一个 class Both 作为它们两者的 child。更准确地说,我正在将方法从构造函数原型复制到 child class 原型。

我明白这不是真正的继承,但对我来说已经足够了。

还有其他问题。如何让打字稿接受复制的方法?

class First {
  someMethod() {
    console.log('someMethod from First');
  }
}

function Second() {
  console.log('Second');
}

Second.prototype.doSmth = function () { 
  console.log('doSmth from Second');
}

interface IBoth {
  someMethod()
  doSmth()
}

class Both extends First /* implements IBoth */ {
  constructor() {
    console.log('constructor of Both');
    super();
    Second.call(this);
  }
}

for (let key in Second.prototype) {
  Both.prototype[key] = Second.prototype[key];
}

事实上,我需要更深入地了解方法:

class Final extends Both {
  doIt() {
    this.someMethod();
    //this.doSmth(); // How to make this call threated as correct?
    (this as any as IBoth).doSmth(); // That compiles, but it's awfull
  }
}

如果在这种情况下方法在 class Both 中不可见,没关系。

我已经试过了:

  1. 写作时

    class Both extends First implements IBoth {
    

    typesctipt 说我还没有实现接口方法。

  2. Both 重命名为 _Both 并使用

    var Both = _Both as typeof _Both;
    

    留下与原始代码相同的问题,因为 First 从未被提及。

  3. 如果我将 Both 重命名为 _Both 并写入

    var Both = _Both as typeof IBoth;
    

    typescript 找不到 IBoth.

还有其他方法可以到达吗?


您可以在 http://www.typescriptlang.org/Playground
试试 Full code there

添加此行和 运行 代码(将代码从右侧面板复制到浏览器控制台):

(new Final).doIt();

this.doSmth(); 未注释时的输出:

constructor of Both
Second
someMethod from First
doSmth from Second
doSmth from Second

PS: Same question in Russian.

试试这个:

class Both extends First {
  constructor() {...}
  doSmth: typeof Second.prototype.doSmth;
}

Demo

最好将 Second 作为 class 而不是函数。如果是 javascript 模块,请添加声明文件。

最后,如果您不能为 Second 添加类型,只需像这样为每个函数添加类型:

class Both extends First {
  constructor() {...}
  doSmth: () => void;
}

不需要接口。只需要声明一个原型字段 via

doSmth: () => void

它作为一个 属性 可见,而不是作为一种方法,但没关系。

完整列表:

class First {
  someMethod() {
    console.log('someMethod from First');
  }
}

function Second() {
  console.log('Second');
}

Second.prototype.doSmth = function () { 
  console.log('doSmth from Second');
}

class Both extends First {
  constructor() {
    console.log('constructor of Both');
    super();
    Second.call(this);
  }

  doSmth: () => void
}

for (let key in Second.prototype) {
  Both.prototype[key] = Second.prototype[key];
}

class Final extends Both {
  doIt() {
    this.someMethod();
    this.doSmth();
    //Both.prototype.doSmth(); // ok
    //Final.prototype.doSmth(); // ok
  }
}

PS:typescript class prototype variable 应该 google 而不是关于继承的不同组合。