import { Evt } from 'evt';
/**
 * @private
 */
export interface EventEmitterish<EventTypes extends [string, any]> {
    on<T extends EventTypes, K extends T[0]>(id: K, callback: (event: T extends readonly [K, infer U] ? U : never) => void): this;
    once: EventEmitterish<EventTypes>['on'];
    removeListener: EventEmitterish<EventTypes>['on'];
    removeAllListeners(id?: EventTypes[0]): this;
    /**
     * Returns a promise that resolve after
     * each async callbacks have resolved.
     */
    emit<T extends EventTypes, K extends T[0]>(id: K, event: T extends readonly [K, infer U] ? U : never): Promise<void>;
}
export declare function EventEmitterishMixin<EventTypes extends [string, any], TBase extends new (...args: any[]) => {}>(Base: TBase, getEvt: (parameters: {
    constructorArgs: ConstructorParameters<TBase>;
    instance: InstanceType<TBase>;
}) => Evt<EventTypes>): {
    new (...args: any[]): {
        on<T extends EventTypes, K extends T[0]>(id: K, callback: (event: T extends readonly [K, infer U] ? U : never) => void): any;
        once<T extends EventTypes, K extends T[0]>(id: K, callback: (event: T extends readonly [K, infer U] ? U : never) => void): any;
        removeListener<T extends EventTypes, K extends T[0]>(id: K, callback: (event: T extends readonly [K, infer U] ? U : never) => void): any;
        removeAllListeners(id?: EventTypes[0]): any;
        /**
         * Returns a promise that resolve after
         * each async callbacks have resolved.
         */
        emit<T extends EventTypes, K extends T[0]>(id: K, event: T extends readonly [K, infer U] ? U : never): Promise<void>;
    };
} & TBase;
//# sourceMappingURL=EventEmitterishMixin.d.ts.map