이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
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를 뽑는다는 의미이다.
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 15-Last of Array (medium) (0) | 2023.03.22 |
---|---|
타입챌린지 : 12-Chainable Options (medium) (0) | 2023.03.21 |
타입챌린지 : 9-Deep Readonly (medium) (0) | 2023.03.16 |
타입챌린지 : 8-Readonly 2 (medium) (0) | 2023.03.12 |
타입챌린지 : 3-Omit (medium) (0) | 2023.03.11 |