export type DeepReadonly = T extends any[] ? DeepReadonlyArray : T extends object ? DeepReadonlyObject : T; type NonFunctionPropertyNames = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T]; interface DeepReadonlyArray extends ReadonlyArray> {} type DeepReadonlyObject = { readonly [P in NonFunctionPropertyNames]: DeepReadonly; };