export type AsyncHandler = { resolve: (t: T | PromiseLike) => void; reject: (err: any) => void; }; type ExtractResult = Args extends [AsyncHandler, ...any[]] ? T : never; type ExtractArgs = Args extends [AsyncHandler, ...infer Rest] ? Rest : never; export function useAsyncEmits>(emits: (evt: any, ...args: any[]) => void) { const emitsAsync = (evt: Evt, ...args: ExtractArgs) => new Promise>((resolve, reject) => { emits(evt, { resolve, reject }, ...args); }); return emitsAsync; } export function handleAsync(handler: (...args: Args) => Promise) { return ({ resolve, reject }: AsyncHandler, ...args: Args) => handler(...args).then(resolve, reject); }