export type Deferred = Promise & { resolve: (value?: T | PromiseLike) => void reject: (reason?: any) => void } export function deferred(): Deferred { let methods const promise = new Promise((resolve, reject): void => { methods = { resolve, reject } }) return Object.assign(promise, methods) as Deferred }