代码之家  ›  专栏  ›  技术社区  ›  Jake Holzinger

隐性遗传

  •  0
  • Jake Holzinger  · 技术社区  · 6 年前

    我正在使用一个扩展类原型的库。虽然不重要,但在我的例子中,库添加了 EventEmitter 原型到我的类,然后它用 事件发射器 是的。我需要登记参加活动,但我很难 this 玩得好。该库是在ES6样式继承之前通过 extends 关键字已引入,我无法更改库,因此必须依赖类中的某种隐式继承。

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


    示例代码

    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', ...)
        }
    }
    

    派生类的构造函数必须包含“super”调用。


    铸造到 事件发射器 在调用这些方法之前。

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

    [时间] 类型“this”无法转换为类型“eventemitter”。 类型“foo”与类型“eventemitter”不可比。 类型“foo”中缺少属性“addListener”。


    铸造到 any 然后到 事件发射器 行,但感觉像是个黑客。到处需要一个演员也不是很优雅,我觉得有一个比较合适的解决方案。

    class Foo {
        constructor() {
            const e = this as any as EventEmitter;
            e.on('event', ...)
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

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

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