export type CustomPromise = Promise & { __errorType: E } export function makePromise( executor: ( resolve: (value: T | PromiseLike) => void, reject: (reason: E) => void ) => void ): CustomPromise { return new Promise(executor) as CustomPromise } export type Deferred = CustomPromise & { resolve: (arg: T) => void reject: (arg: E) => void } export const defer = (): Deferred => { let resolve, reject const p = makePromise((resolve_, reject_) => { resolve = resolve_ reject = reject_ }) return (Object.assign(p, {resolve, reject}) as unknown) as Deferred }