Skip to content

Instantly share code, notes, and snippets.

@ThisNils
Created October 17, 2022 08:12
Show Gist options
  • Save ThisNils/26756616543c35960fe122c4ee617d19 to your computer and use it in GitHub Desktop.
Save ThisNils/26756616543c35960fe122c4ee617d19 to your computer and use it in GitHub Desktop.
Adds types to EventEmitter methods
import { EventEmitter } from 'events';
type EventTypes = Record<string | symbol, (...args: []) => void>;
/**
* Adds types to the following methods of {@link EventEmitter}
* * {@link EventEmitter.on}
* * {@link EventEmitter.off}
* * {@link EventEmitter.once}
* * {@link EventEmitter.emit}
* * {@link EventEmitter.removeAllListeners}
* * {@link EventEmitter.eventNames}
* * {@link EventEmitter.listenerCount}
*/
abstract class EventBase<T = EventTypes> extends EventEmitter {
constructor() {
super();
}
public on<E extends keyof T>(event: Extract<E, string | symbol>, listener: T[E] extends (...args: any[]) => void ? T[E] : never) {
return super.on(event, listener);
}
public off<E extends keyof T>(event: Extract<E, string | symbol>, listener: T[E] extends (...args: any[]) => void ? T[E] : never) {
return super.off(event, listener);
}
public once<E extends keyof T>(event: Extract<E, string | symbol>, listener: T[E] extends (...args: any[]) => void ? T[E] : never) {
return super.once(event, listener);
}
public emit<E extends keyof T>(event: Extract<E, string | symbol>, ...args: T[E] extends (...args: any[]) => void ? Parameters<T[E]> : never) {
return super.emit(event, args);
}
public removeAllListeners<E extends keyof T>(event?: Extract<E, string | symbol>) {
return super.removeAllListeners(event);
}
public eventNames() {
return super.eventNames();
}
public listenerCount<E extends keyof T>(event: Extract<E, string | symbol>) {
return super.listenerCount(event);
}
}
export default EventBase;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment