export type ControllablePromise = Promise & { resolve(val: T): void reject(err?: E): void } export function createControllablePromise< T = any, E = any >(): ControllablePromise { let _resolve: any let _reject: any const promise = new Promise((resolve, reject) => { _resolve = resolve _reject = reject }) ;(promise as ControllablePromise).resolve = _resolve ;(promise as ControllablePromise).reject = _reject return promise as ControllablePromise }