export interface Deferred { resolve: (value?: T | PromiseLike) => void; reject: (reason?: any) => void; promise: PromiseLike; } export function deferred(): Deferred { let _resolve: (value?: T | PromiseLike) => void; let _reject: (reason?: any) => void; return Object.freeze({ get resolve() { return _resolve; }, get reject() { return _reject; }, promise: new Promise((resolve, reject) => { _resolve = resolve; _reject = reject; }), }); }