type InferErrors = T extends TypedPromise ? E : never; export default class TypedPromise extends Promise { // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor( executor: (resolve: (value: T | PromiseLike) => void, reject: (reason: E) => void) => void, ) { super(executor); } catch( onrejected?: ((reason: E) => TResult | PromiseLike) | null | undefined, ): TypedPromise { return super.catch(onrejected); } static resolve: { (): TypedPromise; (value: V): TypedPromise, never>; } = (value?: V): TypedPromise, never> => { return super.resolve(value) as TypedPromise, never>; }; static reject(reason: E): TypedPromise { return super.reject(reason); } static all( values: T, ): TypedPromise<{ -readonly [P in keyof T]: Awaited }, InferErrors> { return super.all(values) as any; } static race | any)[]>( values: T, ): TypedPromise< T[number] extends TypedPromise ? U : T[number] extends PromiseLike ? U : Awaited, InferErrors > { return super.race(values); } }