export type Immutable = T extends ( infer R )[] ? ReadonlyArray> // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type : T extends Function ? T : T extends object ? { readonly [P in keyof T]: Immutable } : T; export type DeepReadonlyArray = ReadonlyArray>; export type DeepReadonly = T extends ( infer R )[] ? DeepReadonlyArray // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type : T extends Function ? T : T extends object ? { readonly [P in keyof T]: DeepReadonly } : T;