koSakano/type-challenges

5 - Get Readonly Keys

Opened this issue · 0 comments

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

type GetReadonlyKeys<T> = keyof {
  [P in keyof T as IfEquals<{ -readonly [PP in P]: T[PP] }, { [PP in P]: T[PP] }, never, P>]: T[P]
}