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>>