```ts // Map all your event names with their handlers type CustomEmitterEvents = { eventA: (payload: number) => void eventB: (payload: string) => void eventC: (arg: boolean, msg: string) => void } // Interface of your sublcass, matches the EventEmitter method signatures interface CustomEmitter { // Matches EventEmitter.on on(event: T, listener: CustomEmitterEvents[T]): this // Matches EventEmitter.off off(event: T, listener: CustomEmitterEvents[T]): this // Matches EventEmitter.emit emit(event: T, ...args: Parameter: boolean } // Define your subclass class SuperEmitter extends EventEmitter implements CustomEmitter { // Override parent class on method override on(event: T, listener: CustomEmitterEvents[T]): this { super.on(event, listener) return this } // other stuff... } // You can use it like below const emitter = new SuperEmitter() emitter.on('eventA', (payload: number) => { // your stuff... }) emitter.on('eventC', (arg: boolean, msg: string) => { // your stuff... }) ``` THX to [BRIAN MANCINI](https://www.derpturkey.com/typescript-and-node-js-eventemitter/) for his idea.