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