type IpcListenEventMap = {
    [key: string]: [...args: any[]];
};
type IpcHandleEventMap = {
    [key: string]: (...args: any[]) => any;
};
type IpcEventMap = IpcListenEventMap | IpcHandleEventMap;
type ExtractArgs<T> = T extends IpcListenEventMap ? T : never;
type ExtractHandler<T> = T extends IpcHandleEventMap ? T : never;

/**
 * Typed listener for Electron `ipcMain`.
 */
declare class IpcListener<T extends IpcEventMap> {
    private listeners;
    private handlers;
    /**
     * Listen to `channel`.
     */
    on<E extends keyof ExtractArgs<T>>(channel: Extract<E, string>, listener: (e: Electron.IpcMainEvent, ...args: ExtractArgs<T>[E]) => void | Promise<void>): void;
    /**
     * Handle a renderer invoke request.
     */
    handle<E extends keyof ExtractHandler<T>>(channel: Extract<E, string>, listener: (e: Electron.IpcMainInvokeEvent, ...args: Parameters<ExtractHandler<T>[E]>) => ReturnType<ExtractHandler<T>[E]> | Promise<ReturnType<ExtractHandler<T>[E]>>): void;
    /**
     * Dispose all listeners and handlers.
     */
    dispose(): void;
}
/**
 * Typed emitter for sending an asynchronous message to the renderer process.
 */
declare class IpcEmitter<T extends IpcListenEventMap> {
    /**
     * Send an asynchronous message to the renderer process.
     */
    send<E extends keyof T>(sender: Electron.WebContents, channel: Extract<E, string>, ...args: T[E]): void;
}

export { type ExtractArgs, type ExtractHandler, IpcEmitter, type IpcEventMap, type IpcHandleEventMap, type IpcListenEventMap, IpcListener };
