export interface Deferred { resolve(result: T | PromiseLike | undefined): void reject(err: Error): void } export class DeferredPromise implements Deferred { readonly resolve: (result: T | PromiseLike | undefined) => void readonly reject!: (err: Error) => void readonly promise!: Promise constructor() { let res: (result: T | PromiseLike | undefined) => void let rej: (err: Error) => void this.promise = new Promise((resolve, reject) => { res = resolve rej = reject }) this.resolve = res! this.reject = rej! } }