Skip to content

Latest commit

 

History

History
72 lines (61 loc) · 2.41 KB

OptionalUndefined.md

File metadata and controls

72 lines (61 loc) · 2.41 KB
标题 标签
OptionalUndefined(含有未定义的属性变成可选属性) extends,infer(继承,推断)

含有未定义的属性变成可选属性。

  • 创建一个 Merge 类型,用于将合并后的两个接口转换成一个接口,代码如下所示:
type Merge<T> = {
  [K in keyof T]: T[K];
};
  • 构建第三个参数,如果是第一个参数 T 的属性,并且等于 undefined,则返回该属性,否则返回 never。将该属性以及其属性值转成可选,并使用 Exclude 类型将参数 T 中含有该属性的排除掉,两者取并集,然后在使用 Merge 类型转换。

代码如下:

type OptionalUndefined<
  T,
  Props extends keyof T = keyof T,
  OptionsProps extends keyof T = Props extends keyof T
    ? undefined extends T[Props]
      ? Props
      : never
    : never
> = Merge<
  {
    [K in OptionsProps]?: T[K];
  } & {
    [K in Exclude<keyof T, OptionsProps>]: T[K];
  }
>;

使用方式:

type OptionalUndefinedRes1 = OptionalUndefined<
  { value: string | undefined },
  'value'
>; //  { value?: string | undefined }
type OptionalUndefinedRes2 = OptionalUndefined<
  { value: string; desc: string },
  'value'
>; //  { value: string; desc: string }
type OptionalUndefinedRes3 = OptionalUndefined<
  { value: string | undefined; desc: string },
  'value'
>; //  { value?: string | undefined; desc: string }
type OptionalUndefinedRes4 = OptionalUndefined<
  { value: string | undefined; desc: string | undefined },
  'value'
>; //  { value?: string | undefined; desc: string | undefined }
type OptionalUndefinedRes5 = OptionalUndefined<
  { value: string | undefined; desc: string },
  'value' | 'desc'
>; //  { value?: string | undefined; desc: string }
type OptionalUndefinedRes6 = OptionalUndefined<{
  value: string | undefined;
  desc: string | undefined;
}>; //  { value?: string | undefined; desc?: string | undefined }
type OptionalUndefinedRes7 = OptionalUndefined<{ value?: string }, 'value'>; //  { value?: string }
type OptionalUndefinedRes8 = OptionalUndefined<{ value?: string }>; //  { value?: string | undefined }

应用场景

如下所示,鼠标悬浮到对应的类型变量可以查看类型。