type Listener = (...args: any[]) => void type NanobusListener = K extends keyof E ? E[K] : Listener type StarListener = (eventName: keyof E | symbol, data: any[], performanceTimingId?: string) => void type AnyListener = K extends "*" ? StarListener : NanobusListener type Events = { [eventName: string]: Listener } declare class Nanobus { protected _name: string protected _starListeners: StarListener[] protected _listeners: { [K in keyof E]?: E[K][] } constructor(name?: string) emit(eventName: K, ...args: Parameters>): this protected _emit(array: StarListener[], eventName: K, data: Parameters>, performanceTimingId?: string): void protected _emit(array: E[K][], data: Parameters): void protected _emit(array: Listener[], data: any[]): void on(eventName: K, listener: AnyListener): this addListener(eventName: K, listener: AnyListener): this prependListener(eventName: K, listener: AnyListener): this once(eventName: K, listener: AnyListener): this prependOnceListener(eventName: K, listener: AnyListener): this removeListener(eventName: K, listener: AnyListener): true | undefined removeAllListeners(eventName?: keyof E | "*" | symbol): this listeners(eventName: K): AnyListener[] } export = Nanobus