使所有可能未定义的属性成为可选的泛型类型

时间:2020-10-05 09:22:18

标签: typescript generics

我想定义一个通用类型,使给定类型的所有可能未定义的属性都是可选的。

示例:

type MyType = {
  a: number | undefined
  b: number
}

我正在寻找通用类型

type OptionalUndefined<MyType>

这应该导致

{
  a?: number | undefined
  b: number
}

我尝试了这个,但是不起作用:

type OptionalUndefined<T> = {
  [P in keyof T]: T[P] extends undefined ? T[P] | never : T[P]
}

任何想法如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您需要将最终类型构造为具有可选属性的对象类型与包含其余属性的对象类型之间的交集。

您可以使用与here类似的方法来过滤未定义的键。使用undefined键,您可以从Pick T中使用它们,并使用Partial进行选择,以获取具有可选属性的对象类型。另一方面,您可以使用Omit来省略undefined

中的T属性
type MyType = {
  a: number | undefined
  b: number
}


type UndefinedKeys<T> = {
    [P in keyof T]: undefined extends T[P]  ? P: never
}[keyof T]

type OptionalUndefined<T> = Partial<Pick<T, UndefinedKeys<T>>> & Omit<T, UndefinedKeys<T>>
type Id<T> = {} & { [P in keyof T] : T[P]}
type X = Id<OptionalUndefined<MyType>>
// type X = {
//     a?: number | undefined;
//     b: number;
// }

Playground Link

注意:Id用于平整结果类型,但这不是必需的,它可以使类型更易于阅读。