/** Promise type with strongly typed error */ export type CustomPromise = Promise & { __errorType: E } /** * Creates a Promise with strongly typed error * @param executor - Promise executor function * @returns Promise with typed error */ export function makePromise( executor: (resolve: (value: T | PromiseLike) => void, reject: (reason: E) => void) => void, ): CustomPromise { return new Promise(executor) as CustomPromise } /** Promise with exposed resolve/reject functions and typed error */ export type Deferred = CustomPromise & { resolve: (arg: T) => void reject: (arg: E) => void } /** * Creates a Deferred promise * @returns Promise with resolve/reject methods exposed */ 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 }