export type PromiseResolveCb = (value: T | PromiseLike) => void; export type PromiseRejectCb = (reason?: any) => void; export interface IDeferredPromise { promise: Promise; resolve: PromiseResolveCb; reject: PromiseRejectCb; } /** * A closure-less alternative to new Promise(...) * @returns */ export function deferred(): IDeferredPromise { let resolve!: PromiseResolveCb; let reject!: PromiseRejectCb; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject }; }