문자열 배열이 주어지면, 순열과 조합을 수행해라
Given an array of strings, do Permutation & Combination.
type CombinationImplement<T extends string[],U extends string = T[number], D extends string = U> =
D extends U?
[Exclude<U,D>] extends [never]?
D
:`${D} ${CombinationImplement<T,Exclude<U,D>>}` | CombinationImplement<T,Exclude<U,D>>
:never
type Combination<T extends string[]>=CombinationImplement<T>
우선 사용처에서 구현용 제네릭을 사용하지 못하게 하기 위해 구현과 실제 타입을 분리했다.
분배용인 D와 유니온을 지정할 U라는 제네릭을 사용하였다.
타입의 흐름은 다음과 같다.
1) U가 유니온 타입이 아닐 경우 (U에서 D를 제외할 때 never인 경우)
-> D를 반환한다
2) U가 유니온 타입일 경우
-> U에서 해당 D를 제외하고 조합한 값, 그리고 그 값을 D와 붙인 내용을 반환한다.
type Combination<T extends string[], All = T[number], Item = All>
= Item extends string
? Item | `${Item} ${Combination<[], Exclude<All, Item>>}`
: never
내 풀이를 이겨봐:) 라는 도발성 제목의 풀이가 있어 가져와봤다.
https://github.com/type-challenges/type-challenges/issues/11027