我正在使用一个扩展类原型的库。尽管并不重要,但在我的情况下,库将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', ...)
}
}
答案 0 :(得分:1)
您可以使用类/接口声明合并:
declare class EventEmitter{
on(n:string):void
}
interface Foo extends EventEmitter { }
class Foo {
constructor() {
this.on('event')
}
}