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>;
