export declare type MatchingKeys<TRecord, TMatch, K extends keyof TRecord = keyof TRecord> = K extends (TRecord[K] extends TMatch ? K : never) ? K : never;
export declare type VoidKeys<Record> = MatchingKeys<Record, void>;
export interface TypeRecord<T, U, V> {
    ' _emitterType'?: T;
    ' _eventsType'?: U;
    ' _emitType'?: V;
}
export declare type OverriddenMethods<TEventRecord, TEmitRecord = TEventRecord, EventVK extends VoidKeys<TEventRecord> = VoidKeys<TEventRecord>, EventNVK extends Exclude<keyof TEventRecord, EventVK> = Exclude<keyof TEventRecord, EventVK>, EmitVK extends VoidKeys<TEmitRecord> = VoidKeys<TEmitRecord>, EmitNVK extends Exclude<keyof TEmitRecord, EmitVK> = Exclude<keyof TEmitRecord, EmitVK>> = {
    on<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any;
    on<P extends EventVK>(event: P, listener: () => void): any;
    addListener<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any;
    addListener<P extends EventVK>(event: P, listener: () => void): any;
    addEventListener<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any;
    addEventListener<P extends EventVK>(event: P, listener: () => void): any;
    removeListener<P extends EventVK | EventNVK>(event: P, listener: Function): any;
    once<P extends EventNVK>(event: P, listener: (m: TEventRecord[P], ...args: any[]) => void): any;
    once<P extends EventVK>(event: P, listener: () => void): any;
    emit<P extends EmitNVK>(event: P, request: TEmitRecord[P]): any;
    emit<P extends EmitVK>(event: P): any;
};
export declare type OverriddenKeys = keyof OverriddenMethods<any, any, any>;
export declare type StrictEventEmitter<TEmitterType, TEventRecord, TEmitRecord = TEventRecord, UnneededMethods extends Exclude<OverriddenKeys, keyof TEmitterType> = Exclude<OverriddenKeys, keyof TEmitterType>, NeededMethods extends Exclude<OverriddenKeys, UnneededMethods> = Exclude<OverriddenKeys, UnneededMethods>> = TypeRecord<TEmitterType, TEventRecord, TEmitRecord> & Pick<TEmitterType, Exclude<keyof TEmitterType, OverriddenKeys>> & Pick<OverriddenMethods<TEventRecord, TEmitRecord>, NeededMethods>;
export default StrictEventEmitter;
export declare type NoUndefined<T> = T extends undefined ? never : T;
export declare type StrictBroadcast<TEmitter extends TypeRecord<any, any, any>, TEmitRecord extends NoUndefined<TEmitter[' _emitType']> = NoUndefined<TEmitter[' _emitType']>, VK extends VoidKeys<TEmitRecord> = VoidKeys<TEmitRecord>, NVK extends Exclude<keyof TEmitRecord, VK> = Exclude<keyof TEmitRecord, VK>> = {
    <E extends NVK>(event: E, request: TEmitRecord[E]): any;
    <E extends VK>(event: E): any;
};
export declare type EventNames<TEmitter extends TypeRecord<any, any, any>, TEventRecord extends NoUndefined<TEmitter[' _eventsType']> = NoUndefined<TEmitter[' _eventsType']>, TEmitRecord extends NoUndefined<TEmitter[' _emitType']> = NoUndefined<TEmitter[' _emitType']>> = keyof TEmitRecord | keyof TEventRecord;
export declare type OnEventNames<TEmitter extends TypeRecord<any, any, any>, TEventRecord extends NoUndefined<TEmitter[' _eventsType']> = NoUndefined<TEmitter[' _eventsType']>, TEmitRecord extends NoUndefined<TEmitter[' _emitType']> = NoUndefined<TEmitter[' _emitType']>> = keyof TEventRecord;
export declare type EmitEventNames<TEmitter extends TypeRecord<any, any, any>, TEventRecord extends NoUndefined<TEmitter[' _eventsType']> = NoUndefined<TEmitter[' _eventsType']>, TEmitRecord extends NoUndefined<TEmitter[' _emitType']> = NoUndefined<TEmitter[' _emitType']>> = keyof TEmitRecord;
