JavaScript의 Array.concat 함수를 타입 시스템에서 구현하세요. 타입은 두 인수를 받고, 인수를 왼쪽부터 concat한 새로운 배열을 반환해야 합니다.
type Concat<T extends any[]|readonly any[], U extends any[]|readonly any[]>
= [...T,...U]
두 개의 배열 제네릭을 받아서 하나의 배열을 spread 타입으로 푼 두 개의 배열로 묶는다
any[]로는 튜플 형태의 타입을 받을 수 없어 readonly 타입 역시 받을 수 있게 하였다.
type Concat<T extends unknown[], U extends unknown[]> = [...T,...U]
이 풀이는 readonly가 포함된 튜플을 받을 수 없다
type Concat<T extends readonly any[], U extends readonly any[]> = [...T, ...U]
이 풀이는 readonly가 포함되어있지 않는 일반적인 배열 타입이더라도 제네릭에서 에러가 나지 않는다
내 풀이에는 없는 unknown과 any의 차이를 알아보자
any는 never를 제외한 모든 타입에 할당할 수 있고
unknown은 any를 제외한 어떤 타입에도 할당할 수 없다
타입이 1인 값을 unknown에 넣을 수는 없지만,
타입이 1인 값을 any에 넣을 수는 있다.