1

I need generic that from interface like type X = { a: string, b?: string, c: number } would extract required keys 'a' | 'c'

I came up with

type RequiredFields<T> =
  keyof T extends infer R
    ? R extends keyof T
      ? undefined extends T[R]
        ? never
        : R
      : never
    : never

And I wonder if there is easier/more legitimate way of achieving this

konrad
  • 111
  • 1
  • 6

2 Answers2

1

Another Possible way would be this one:

type RequiredFields<T extends object> = Exclude<{
  [K in keyof T]: T extends Record<K, T[K]>
    ? K
    : never
}[keyof T], undefined>
dege
  • 2,824
  • 2
  • 25
  • 33
0

Your solution is not bad at all. That's what I'm using:

type RequiredPropertyOf<T> = Exclude<{
  [K in keyof T]:
    Extract<T[K], undefined> extends never
      ? K
      : never
}[keyof T], undefined>
Karol Majewski
  • 23,596
  • 8
  • 44
  • 53