隐式继承

时间:2018-06-23 02:32:22

标签: node.js typescript inheritance prototypal-inheritance

我正在使用一个扩展类原型的库。尽管并不重要,但在我的情况下,库将EventEmitter原型添加到我的类中,然后使用EventEmitter的实例实例化该类。我需要注册参加活动,但是我无法让this表现得很好。该库是在通过extends关键字引入ES6样式继承之前创建的,我无法更改该库,因此我必须在类中依赖某种隐式继承。

是否可以隐式继承其他类型?


示例代码

import { EventEmitter } from 'events';
import { inherits } from 'util';

class Foo {
    constructor() {
        // Do something assuming
        // 'this' is an event emitter
    }
}

inherits(Foo, EventEmitter);

Foo.call(new EventEmitter());

我尝试过的

显式继承-期望调用super,该对象已经是事件发射器,我只想将类型绑定到我的类。

class Foo extends EventEmitter {
    constructor() {
        this.on('event', ...)
    }
}
  

[ts]派生类的构造函数必须包含一个“超级”调用。


在调用这些方法之前先铸造到EventEmitter

class Foo {
    constructor() {
        const e = this as EventEmitter;
        e.on('event', ...)
    }
}
  

[ts]   类型“ this”不能转换为类型“ EventEmitter”。     “ Foo”类型与“ EventEmitter”类型不具有可比性。        类型'Foo'中缺少属性'addListener'。


先投射到any,然后再投射到EventEmitter,但是感觉很简单。到处都需要演员阵容也不是很优雅,我觉得有一个更合适的解决方案。

class Foo {
    constructor() {
        const e = this as any as EventEmitter;
        e.on('event', ...)
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用类/接口声明合并:

declare class EventEmitter{
  on(n:string):void
}
interface Foo extends EventEmitter { }
class Foo  {
    constructor() {
        this.on('event')
    }
}