I have a class extends EventEmitter
that can emit event hello
. How can I declare the on
method with specific event name and listener s
to extend @SergeyK's answer, with this you can get type-checking and completion on both emit
and on
functions without repeating event types.
interface MyClassEvents {
'add': (el: string, wasNew: boolean) => void;
'delete': (changedCount: number) => void;
}
MyClass
, based on EventListeners (MyClassEvents
) function signature:declare interface MyClass {
on(
event: U, listener: MyClassEvents[U]
): this;
emit(
event: U, ...args: Parameters
): boolean;
}
EventEmitter
:class MyClass extends EventEmitter {
constructor() {
super();
}
}
Now you will get type checking for on
and emit
functions:
Unfortunately you will get completion and type-checking only on those two functions (unless you define more functions inside MyClass interface).
To get more generic solution, you can use this package. note: it adds no runtime overhead.
import { TypedEmitter } from 'tiny-typed-emitter';
interface MyClassEvents {
'add': (el: string, wasNew: boolean) => void;
'delete': (changedCount: number) => void;
}
class MyClass extends TypedEmitter {
constructor() {
super();
}
}