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 emitter for Electron `ipcRenderer`.
 */
declare class IpcEmitter<T extends IpcEventMap> {
    send<E extends keyof ExtractArgs<T>>(channel: Extract<E, string>, ...args: ExtractArgs<T>[E]): void;
    invoke<E extends keyof ExtractHandler<T>>(channel: Extract<E, string>, ...args: Parameters<ExtractHandler<T>[E]>): Promise<ReturnType<ExtractHandler<T>[E]>>;
}
/**
 * Typed listener for Electron `ipcRenderer`.
 */
declare class IpcListener<T extends IpcListenEventMap> {
    on<E extends keyof T>(channel: Extract<E, string>, listener: (e: Electron.IpcRendererEvent, ...args: T[E]) => void): () => void;
    once<E extends keyof T>(channel: Extract<E, string>, listener: (e: Electron.IpcRendererEvent, ...args: T[E]) => void | Promise<void>): () => void;
}

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