export interface Deferred { resolve(value: T): void; reject(reason: unknown): void; promise: Promise; } /** * @param handleCatch rejected promises automatically to allow free usage */ export function deferred( handleCatch?: () => T | Promise ): Deferred { let resolve: Deferred["resolve"] | undefined = undefined, reject: Deferred["reject"] | undefined = undefined; const promise = new Promise((resolveFn, rejectFn) => { resolve = resolveFn; reject = rejectFn; }); ok(resolve); ok(reject); return { resolve, reject, promise: handleCatch ? promise.catch(handleCatch) : promise, }; } function ok(value: unknown): asserts value { if (!value) { throw new Error("Value not provided"); } }