import { ComponentPrototype } from "./utils";
export interface EventEmitter {
  emit(event: string, ...args: any[]): EventEmitter;
  on(event: string, fn: (...args: any[]) => any): EventEmitter;
  once(event: string, fn: (...args: any[]) => any): EventEmitter;
  off(event: string, fn: (...args: any[]) => any): EventEmitter;
}
declare type EmitEvents<T> = T extends EventEmitter ? Parameters<T["emit"]>[0] : string;
export interface EventOptions<E extends string | undefined> {
  emitter: string;
  namespace?: string;
  on?: E;
}
export declare function Emit<T extends EventEmitter = any, E extends EmitEvents<T> | undefined = any>(opts: EventOptions<E>): (prototype: ComponentPrototype, propertyName: E extends EmitEvents<T> ? string : E) => void;
declare type ReceiveEvents<T> = T extends EventEmitter ? Parameters<T["on"]>[0] : string;
export declare function Receive<T extends EventEmitter = any, E extends ReceiveEvents<T> | undefined = any>(opts: EventOptions<E>): (prototype: ComponentPrototype, propertyName: E extends ReceiveEvents<T> ? string : E) => void;
export {};
