/** * Forked from ts-toolbelt * https://github.com/millsp/ts-toolbelt/blob/9c27a61b39eae7f2794c349973e78023894885c3/sources/Any/Compute.ts#L1 */ /** * @hidden */ export type ComputeRaw = A extends Function ? A : { [K in keyof A]: A[K] } & unknown /** * @hidden */ type ComputeFlat = A extends BuiltIn ? A : A extends Array ? A extends Array> ? Array<{ [K in keyof A[number]]: A[number][K] } & unknown> : A : A extends ReadonlyArray ? A extends ReadonlyArray> ? ReadonlyArray<{ [K in keyof A[number]]: A[number][K] } & unknown> : A : { [K in keyof A]: A[K] } & unknown /** * @hidden */ type ComputeDeep = A extends BuiltIn ? A : If< Has, A, A extends Array ? A extends Array> ? Array<{ [K in keyof A[number]]: ComputeDeep } & unknown> : A : A extends ReadonlyArray ? A extends ReadonlyArray> ? ReadonlyArray<{ [K in keyof A[number]]: ComputeDeep } & unknown> : A : { [K in keyof A]: ComputeDeep } & unknown > /** * Force TS to load a type that has not been computed (to resolve composed * types that TS haven't fully resolved, for display purposes mostly). * @param A to compute * @returns `A` * @example */ export type Compute = { flat: ComputeFlat deep: ComputeDeep }[depth] type Depth = 'flat' | 'deep' export type Boolean = 0 | 1 type Key = string | number | symbol /** * Check whether `U` contains `U1` * @param U to be inspected * @param U1 to check within * @returns [[Boolean]] * @example */ type Has = [U1] extends [U] ? 1 : 0 type BuiltIn = Function | Error | Date | { readonly [Symbol.toStringTag]: string } | RegExp | Generator export type If = { 0: Else 1: Then }[B]