type ImmutableArray = readonly Immutable[]; type ImmutableObject = { readonly [P in keyof T]: Immutable; }; export type Immutable = T extends (infer R)[] ? ImmutableArray : // eslint-disable-next-line @typescript-eslint/ban-types T extends Function ? T : T extends object ? ImmutableObject : T;