首页 > 解决方案 > 将未定义的属性映射到可选属性

问题描述

我正在尝试编写一个映射类型,使未定义的属性成为可选的。

更具体地说,我有一个像这样的类型:

interface Input {
  foo: string;
  bar: string | undefined;
  baz: number | undefined;
}

我想使用映射类型将其变成这种类型:

interface Output {
  foo: string;
  bar?: string;
  baz?: number;
}

我只能找到使所有属性可选的示例,这不是我想要的。

标签: typescripttypescript-generics

解决方案


这是一个可能的解决方案(使用 TS 4.1):

interface Input {
    foo: string;
    bar: string | undefined;
    baz: number | undefined;
}

type UndefinedToOptional = { 
  [K in keyof Input as undefined extends Input[K] ? K : never]?: Input[K] 
}

type T1 = Omit<Input, keyof UndefinedToOptional> & UndefinedToOptional
/* 
{
    foo: string;
    bar?: string | undefined;
    baz?: number | undefined;
}
 */


推荐阅读