我有一个基类 EventEmitter
,其中有on
方法来绑定特定事件的处理程序:
class EventEmitter {
on(event: string, handler: Function) {
/* add handler internally */
}
protected emit(event: string, ...args) {
/* call all handlers listening on event */
}
}
现在我有各种各样的子类,可以发出具有不同参数的不同事件。我想“声明”该特定类可以发出哪些事件:
class MyClass extends EventEmitter {
on(event: 'event1', handler: (arg1: number) => void): void;
on(event: 'event2', handler: (arg1: string, arg2: number) => void): void;
}
所以,我的子类可能会发出事件event1
和event2
,但这似乎不是正确的指定方式。TypeScript(tsc 1.8)抱怨:
error TS2415: Class 'MyClass' incorrectly extends base class 'EventEmitter'.
Types of property 'on' are incompatible.
Type '(event: "event1", handler: (arg1: number) => void) => void' is not assignable to type '(event: string, handler: Function) => void'.
Type '(event: "event1", handler: (arg1: number) => void) => void' provides no match for the signature '(event: string, handler: Function): void'
error TS2382: Specialized overload signature is not assignable to any non-specialized signature.
error TS2391: Function implementation is missing or not immediately following the declaration.
那么,指定我的类可以发出的事件的预期方式是什么?
编辑:我找到了我要找的东西的名称:专门签名。然而,它似乎只适用于接口,而不适用于新的TypeScript代码。
现在我找到了另一个问题,关于同样的问题,来自2015年,然而那里的解决方案看起来不太对。那么,今天在TypeScript中还有其他方法可以做到吗?