type Fn = (...arg: any[]) => any; type MaybePromise = T | Promise; type RequiredDeep | Fn | undefined = undefined> = Type extends Fn ? Type : Type extends Record ? { [Key in keyof Type]-?: NonNullable extends NonNullable ? NonNullable : RequiredDeep, U>; } : Type; /** * @fixme Remove this once TS 5.4 is the lowest supported version. * Because "NoInfer" is a built-in type utility there. */ type NoInfer = [T][T extends any ? 0 : never]; export type { MaybePromise, NoInfer, RequiredDeep };