본문 바로가기
Language/Typescript

타입챌린지 : 10-Tuple To Union (medium)

by hsloth 2023. 3. 18.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00010-medium-tuple-to-union/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

 

type TupleToUnion<T extends any[]> = T[number]

type TupleToUnion<T> = T extends [infer F, ...infer O] ? F | TupleToUnion<O> : never;

type TupleToUnion<T> = T extends Array<infer K> ? K: never;

type TupleToUnion<T> = T extends (infer K)[] ? K : never


// test case
type cases = [
  Expect<Equal<TupleToUnion<[123, '456', true]>, 123 | '456' | true>>,
  Expect<Equal<TupleToUnion<[123]>, 123>>,
]

 

Tuple을 Union으로 만드는 타입이다.

 

우선, 내가 가장 먼저 생각한 답은 이거다.

type TupleToUnion<T> = T extends [infer F, ...infer O] ? F | TupleToUnion<O> : never;

튜플에서 어떻게 유니온을 만들지? 라는 생각이 들어 일단 vertical bar를 이용해서 만들었다.

T를 배열의 첫 번째 인자와 나머지로 나누어서 F | TupleToUnion을 리턴한다. 이렇게 하면 | 가 직접적으로 들어가서 생각보다 쉽게 떠오른다.

 

그리고 다른 사람들의 해답들을 봐봤다.

type TupleToUnion<T extends any[]> = T[number]

T는 배열인데, 거기서 차례대로 원소를 뽑는다는 의미를 가진 코드다. 이렇게 해도 유니온 타입이 되는구나... 싶었다.

 

type TupleToUnion<T> = T extends (infer K)[] ? K : never

type TupleToUnion<T> = T extends Array<infer K> ? K: never;

위의 두 코드는 의미를 따지면 동일하다.

T가 배열인데 그 원소를 K라고 하면, 배열을 돌면서 K를 뽑는다는 의미이다.