type DeepPartial = T extends (...args: any[]) => any ? T : T extends Map ? Map, DeepPartial> : T extends Set ? Set> : T extends ReadonlyArray ? T extends readonly [infer First, ...infer Rest] ? readonly [DeepPartial?, ...DeepPartial] : ReadonlyArray> : T extends object ? { [P in keyof T]?: DeepPartial; } & (T extends { [key: string]: infer V; } ? { [key: string]: DeepPartial; } : {}) : T; type DeepOptional = DeepPartial; export type { DeepOptional, DeepPartial };