打字稿:键入带有对象必需属性的键

时间:2020-07-15 07:10:23

标签: typescript typescript-generics

我需要从type X = { a: string, b?: string, c: number }之类的接口中提取通用密钥'a' | 'c'

我想出了

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

我想知道是否有更简单/更合法的方法来实现这一目标

2 个答案:

答案 0 :(得分:1)

另一种可能的方式是:

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

答案 1 :(得分:0)

您的解决方案一点也不差。那就是我正在使用的:

type RequiredPropertyOf<T> = Exclude<{
  [K in keyof T]:
    Extract<T[K], undefined> extends never
      ? K
      : never
}[keyof T], undefined>