가변 적인 수의 타입을 새로운 타입으로 병합하라. 만약 key가 중복된다면, 그 key의 value는 유니온 타입으로 병합되어야 한다.
Merge variadic number of types into a new type. If the keys overlap, its values should be merged into an union.
type MergeAll<XS extends any[]> =
XS extends [infer First,...infer Rest]?
{
[R in keyof First|keyof MergeAll<Rest>]:
(R extends keyof First?First[R]:never)
|(R extends keyof MergeAll<Rest>?MergeAll<Rest>[R]:never)
}
:{}
재귀적으로 문제를 접근했다.
배열의 나머지 요소에 재귀적으로 적용한 타입(MergeAll)과 First를 merge하는 방식으로 구현을 하였다.
Merge를 하는 방법은 이전에 했던 merge와 같다.