본문 바로가기
Language/Typescript

타입챌린지 : 11-Tuple to Object (easy)

by hsloth 2023. 3. 1.

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

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00011-easy-tuple-to-object/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 TupleToObject<T extends readonly any[]> = {
  [P in T[number]]:P
}

 

여기서 const tuple = ['tesla', 'model 3'] as const 일때,

TupleToObject<typeof tuple>{ tesla: 'tesla'; 'model 3': 'model 3'} 와 같다.

 

type TupleToObject : TupleToObject라는 tuple을 object로 변환 시키는 타입을 정의한다.

<T extends readonly any[]> : any타입의 원소를 갖는 읽기만 가능한 배열을 조건으로 하는 T를 정의한다.

[P in T[number]]: P : readonly any[] 자체가 튜플을 이야기하므로, T는 튜플이라고 볼 수있다. 그리고, 튜플은 T[0], T[1] 과 같이 숫자로 원소에 접근할 수 있기 때문에 T[number]와 같이 쓸 수 있으며

[P in T[number]]: P 는 튜플 T의 원소들을 나열하고 그 타입은 P(자기자신) 이라고 정의한다고 해석할 수 있다.

 

{ tesla: 'tesla'; 'model 3': 'model 3'}에서 tesla만 작은 따옴표가 없는 이유는 'tesla' = tesla 이기도 하고, model 3는 중간에 띄어쓰기가 있기 때문에 따옴표를 씌워준 것이다.