declare namespace uevent { interface Event { readonly target: any; readonly type: string; readonly args: any[]; isDefaultPrevented(): boolean; isPropagationStopped(): boolean; preventDefault(); stopPropagation(); } interface ValueEvent extends Event { readonly value: T; } interface EventListener { handleEvent(e: Event): void; handleEvent(e: ValueEvent): T; } type Callback = (e: Event, ...args: any[]) => void; type Callbacks = { [event: string]: Callback | EventListener }; type ValueCallback = (e: ValueEvent, value: T, ...args: any[]) => T; type ValueCallbacks = { [event: string]: ValueCallback | EventListener }; interface EventEmitter { on(events: string | Callbacks, callback?: Callback | EventListener): this; on(events: string | ValueCallbacks, callback?: ValueCallback | EventListener): this; off(events?: string | Callbacks, callback?: Callback | EventListener): this; off(events?: string | ValueCallbacks, callback?: ValueCallback | EventListener): this; once(events: string | Callbacks, callback?: Callback | EventListener): this; trigger(event: string, ...args: any[]): Event; change(event: string, value: T, ...args: any[]): T; } } declare const uevent: { EventEmitter: { new(): uevent.EventEmitter; }; Event: Event, mixin: (target: T) => T; }; export = uevent; export as namespace uevent;