Skip to content

Latest commit

 

History

History
75 lines (64 loc) · 2.31 KB

MapTypes.md

File metadata and controls

75 lines (64 loc) · 2.31 KB
标题 标签
MapTypes(类型映射) extends,map(继承,映射)

类型映射。

  • 定义一个规则类型 MapRule,接受 2 个参数,第一个参数不限,第二个参数可以设定一个默认值 any,然后返回含 mapFrom 和 mapTo 属性的类型,如下所示:
type MapRule<T, U = any> = {
  mapFrom: T;
  mapTo: U;
};
  • 原接口类型映射属性是不会变的,主要变动的是属性值,属性值如果和定义的规则 mapFrom 对应上,并且第二个参数也要和 mapFrom 一一对应,则返回第二个参数对应的属性值 mapTo 所赋予的类型,否则返回 never,两者都不是则返回原接口属性值。

代码如下:

type MapRule<T, U = any> = {
  mapFrom: T;
  mapTo: U;
};
type MapTypes<T, U extends MapRule<any>> = {
  [K in keyof T]: T[K] extends U['mapFrom']
    ? U extends MapRule<any>
      ? U['mapTo']
      : never
    : T[K];
};

使用方式:

type MapTypesRes1 = MapTypes<
  { stringToArray: string },
  { mapFrom: string; mapTo: [] }
>; // { stringToArray: [] }
type MapTypesRes2 = MapTypes<
  { stringToNumber: string },
  { mapFrom: string; mapTo: number }
>; // { stringToNumber: number }
type MapTypesRes3 = MapTypes<
  { stringToNumber: string; skipParsingMe: boolean },
  { mapFrom: string; mapTo: number }
>; // { stringToNumber: number; skipParsingMe: boolean }
type MapTypesRes4 = MapTypes<
  { date: string },
  { mapFrom: string; mapTo: Date } | { mapFrom: string; mapTo: null }
>; // { date: null | Date }
type MapTypesRes5 = MapTypes<
  { date: string },
  { mapFrom: string; mapTo: Date | null }
>; // { date: null | Date }
type MapTypesRes6 = MapTypes<
  { fields: Record<string, boolean> },
  { mapFrom: Record<string, boolean>; mapTo: string[] }
>; // { fields: string[] }
type MapTypesRes7 = MapTypes<
  { name: string },
  { mapFrom: boolean; mapTo: never }
>; // { name: string }
type MapTypesRes8 = MapTypes<
  { name: string; date: Date },
  { mapFrom: string; mapTo: boolean } | { mapFrom: Date; mapTo: string }
>; // { name: boolean; date: string }

应用场景

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