隐式继承
Implicit inheritance
我正在使用一个库来扩展我的 classes 的原型。虽然不重要,但在我的例子中,库将 EventEmitter
原型添加到我的 class,然后它用 EventEmitter
的实例实例化 class。我需要注册参加活动,但我无法让 this
发挥出色。该库是在通过 extends
关键字引入 ES6 样式继承之前创建的,我无法更改该库,因此我必须在我的 classes 中依赖某种隐式继承。
是否可以隐式继承另一种类型?
示例代码
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.
的类型
class Foo extends EventEmitter {
constructor() {
this.on('event', ...)
}
}
[ts] Constructors for derived classes must contain a 'super' call.
在调用这些方法之前转换为 EventEmitter
。
class Foo {
constructor() {
const e = this as EventEmitter;
e.on('event', ...)
}
}
[ts]
Type 'this' cannot be converted to type 'EventEmitter'.
Type 'Foo' is not comparable to type 'EventEmitter'.
Property 'addListener' is missing in type 'Foo'.
转换为 any
然后转换为 EventEmitter
可行,但感觉就像一个 hack。到处都需要强制转换也不是很优雅,我觉得有更合适的解决方案。
class Foo {
constructor() {
const e = this as any as EventEmitter;
e.on('event', ...)
}
}
你可以使用class/interface声明合并:
declare class EventEmitter{
on(n:string):void
}
interface Foo extends EventEmitter { }
class Foo {
constructor() {
this.on('event')
}
}
我正在使用一个库来扩展我的 classes 的原型。虽然不重要,但在我的例子中,库将 EventEmitter
原型添加到我的 class,然后它用 EventEmitter
的实例实例化 class。我需要注册参加活动,但我无法让 this
发挥出色。该库是在通过 extends
关键字引入 ES6 样式继承之前创建的,我无法更改该库,因此我必须在我的 classes 中依赖某种隐式继承。
是否可以隐式继承另一种类型?
示例代码
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.
class Foo extends EventEmitter {
constructor() {
this.on('event', ...)
}
}
[ts] Constructors for derived classes must contain a 'super' call.
在调用这些方法之前转换为 EventEmitter
。
class Foo {
constructor() {
const e = this as EventEmitter;
e.on('event', ...)
}
}
[ts] Type 'this' cannot be converted to type 'EventEmitter'. Type 'Foo' is not comparable to type 'EventEmitter'. Property 'addListener' is missing in type 'Foo'.
转换为 any
然后转换为 EventEmitter
可行,但感觉就像一个 hack。到处都需要强制转换也不是很优雅,我觉得有更合适的解决方案。
class Foo {
constructor() {
const e = this as any as EventEmitter;
e.on('event', ...)
}
}
你可以使用class/interface声明合并:
declare class EventEmitter{
on(n:string):void
}
interface Foo extends EventEmitter { }
class Foo {
constructor() {
this.on('event')
}
}