打字稿如何从未定义的属性转换为可选属性

s97*_*712 12 typescript

我有这样的代码

interface Test {
  prop: number | undefined
}
Run Code Online (Sandbox Code Playgroud)

我想将未定义的属性转换为可选属性,例如

type ToOptional = ???
ToOptional<Test>
/** transform result
{
  prop?: number
}
*/
Run Code Online (Sandbox Code Playgroud)

我应该如何定义 ToOptional?

编辑:

interface Test {
  prop1: number | undefined;
  prop2: number;
}

type ToOptional = ???
ToOptional<Test>
/** transform result
{
  prop1?: number
  prop2: number
}
*/
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 14

undefined您可以使用映射类型和条件类型来提取其中的属性,然后undefined从类型中选取属性。同样,我们需要选择未定义的属性才能取回所有原始属性

interface Test {
    prop: number | undefined
    prop2: number
    prop3?: number
}

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

type ToOptional<T> = Partial<Pick<T, UndefinedProperties<T>>> & Pick<T, Exclude<keyof T, UndefinedProperties<T>>>

type t = ToOptional<Test>
Run Code Online (Sandbox Code Playgroud)