@electron-toolkit/typed-ipc
Version:
Type-safe Electron IPC, best practices in TypeScript.
27 lines (24 loc) • 1.24 kB
TypeScript
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 };