type KeysOfType<T, SelectedType> = {
    [key in keyof T]: SelectedType extends T[key] ? key : never;
}[keyof T];

type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends <
    T
>() => T extends Y ? 1 : 2
    ? A
    : B;

type WriteableKeys<T> = {
    [P in keyof T]: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P>;
}[keyof T];

type WriteableObject<T> = {
    [K in WriteableKeys<T>]: T[K];
};

type OptionalPropertyOf<T> = Exclude<
    {
        [K in keyof T]: T extends Record<K, T[K]> ? never : K;
    }[keyof T],
    undefined
>;

export type WriteableNoOptional<T> = Omit<
    WriteableObject<T>,
    OptionalPropertyOf<T>
>;
export type WithOptionalReadonly<T> = Partial<T>
    & WriteableNoOptional<T>;
