export type PromiseResolveCb = (value: T | PromiseLike) => void; export type PromiseRejectCb = (reason?: any) => void; export interface IDeferredPromise { promise: Promise; resolve: PromiseResolveCb; reject: PromiseRejectCb; } /** * Creates a deferred Promise, where resolve/reject * are exposed to the place that holds the promise. * * Generally bad practice, but there are use-cases where one mixes * callback-based API with Promise API and this is helpful. */ export function deferred(): IDeferredPromise { let resolve!: PromiseResolveCb; let reject!: PromiseRejectCb; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject }; }