export interface Deferred { resolve(value: T): void; reject(reason: unknown): void; promise: Promise; } export function deferred(): 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 }; } function ok(value: unknown): asserts value { if (!value) { throw new Error("Value not provided"); } }