两个数量相同的联合类型映射成对象形式的联合类型

286 阅读1分钟
type  a = 'a'
type  b = 'b'
type  c = 'c'
type  d = 'd'
type  e = 'e'
type  f = 'f'
type  g = 'g'

type type1 = a | b | c
type type2 = e | f | g
type type3 = 
|{'type':a,'payload':e}
|{'type':b,'payload':f}
|{'type':c,'payload':g}


type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void ? I : never;

type UnionToTuple<T> = UnionToIntersection<T extends any ? (t: T) => T : never> extends (_: any) => infer W
    ? [...UnionToTuple<Exclude<T, W>>, W]
    : [];


type GetKeyMapUnion<T extends any[],U extends any[]> = 
  T extends [infer FirstType,...infer RestType]
    ? U extends [infer FirstPayload,...infer RestPayload]
      ? {'type':FirstType,'payload':FirstPayload} | GetKeyMapUnion<RestType,RestPayload>
      : never
    : never

type Result = GetKeyMapUnion<UnionToTuple<type1>,UnionToTuple<type2>>