Recursively making all properties readonly.
readonly
T[K] extends object
type DeepReadonly<T> = { readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K] };