type DeepReadonly = T extends (infer R)[] ? DeepReadonlyArray : T extends Function ? T : T extends object ? DeepReadonlyObject : T; interface DeepReadonlyArray extends ReadonlyArray> { } type DeepReadonlyObject = { readonly [P in keyof T]: DeepReadonly; }; type Nullable = T | null; type Change = { old: T; new: T; } | null; type Changes = { readonly [TKey in keyof T]: Change; }; type WithDefaults> = Props & { [K in keyof DefaultProps]: K extends keyof Props ? NonNullable : never; }; export { DeepReadonly, DeepReadonlyArray, DeepReadonlyObject, Nullable, Change, Changes, WithDefaults };