일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- TypeScript 타입챌린지
- type challenge equal type
- HTTP
- 회고록
- typeorm
- network
- 해커톤
- type-safe configservice
- 백엔드
- typescript type challenge
- 코딩테스트
- Type Challenge
- 굿바이 2024년
- 타입 챌린지
- 타입스크립트
- 2024년 회고록
- npm
- equal 타입
- 타입챌린지
- nestjs
- microsoft azure openai
- node.js
- configmodule
- 월간cs
- 와글와글
- 스터디
- 회고
- TypeScript
- 이펙티브 타입스크립트
- configservice
- Today
- Total
iamkanguk.dev
[타입챌린지 - EASY] 11 - Tuple to Object 본문
문제
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const;
type result = TupleToObject<typeof tuple> // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
풀이
type TupleToObject<T extends readonly any[]> = {
[V in T[number]]: V
}
How to Solve?
- T extends readonly any[]: any 타입의 원소를 갖는 읽기만 가능한 배열을 조건으로 하는 T를 정의한다.
- [V in T[number]]: V: T는 Tuple(길이와 타입이 고정된 배열)이다. 그리고 number는 튜플을 순회할 때 사용할 수 있다.
새로 알게된 점
as const (const assertion)
const assertion은 상수라고 주장하는 것이다. 예를 한번 들어보자.
const ts = 'TypeScript'; // type: 'TypeScript'
let ts = 'TypeScript'; // type: string
위의 코드를 보면 차이점이 뭘까? const로 선언하면 그 값 자체를 Type으로 받아온다. 참고로 string 같이 이미 지정된 타입인 경우에는 Primitive Type이라고 하며, 할당된 특정 값 그 자체를 Type으로 취급하는 것을 Literal Type 이라고 한다.
const SHAPE_TYPES = {
CIRCLE: 'circle',
RECTANGLE: 'rectangle',
TRIANGLE: 'triangle',
}; // { CIRCLE: string; RECTANGLE: string; TRIANGLE: string;
const TEMP_SHAPE_TYPES = {
CIRCLE: 'circle',
RECTANGLE: 'rectangle',
TRIANGLE: 'triangle',
} as const; // { readonly CIRCLE: 'circle', readonly RECTANGLE: 'rectangle' ... }
as const를 사용하면 TypeScript에게 특정 값이 변경되지 않을 것임을 알려준다. 그리고 객체의 모든 필드를 readonly로 만들고 배열인 경우 readonly 배열로 만들어주며 리터럴 값은 그 값 자체의 타입으로 추론한다.
그래서 위의 코드를 보면 as const를 사용하지 않으면 각 속성 값은 string으로 추론되는 것을 볼 수 있다. 이것은 circle이라는 값이 아닌 다른 string 값도 할당될 수 있다는 것이다. 하지만 as const를 사용하게 되면 type 값이 값 그 자체인 circle이 될 수 있기 때문에 다른 string 값이 할당될 수 없다.
후기
아 이 문제는 number를 몰라서... 못풀은 것 같다. 튜플을 어떻게 순회해야 하지? 라는 생각을 계속했는데 결국은 해결하지 못했다 ㅠ
그래도 하나 알아가서 행복!
TypeScript의 강력함: Discriminated Union과 as const 활용하기 | 아웃풋 트레이닝
유형에 따라 갖는 프로퍼티가 다른 경우 Optional Property를 만들어서 불확실한 타입체크를 주기보다는 Dsicriminated Union을 활용한 타입스크립트로 확장성있는 타입을 만들어보자.
baek.dev
- https://velog.io/@jinyoung234/Type-Challenge-
Type Challenge - Tuple to Object
배열(튜플)을 받아, 각 원소의 값을 key/value로 갖는 오브젝트 타입을 반환하는 타입을 구현하세요.어떻게 배열이 객체의 프로퍼티가 되는지 궁금해서 as const에 대해 찾아봤다.as const는 배열을 객
velog.io
'Type Challenge' 카테고리의 다른 글
[타입챌린지-MEDIUM] 8: Readonly 2 (0) | 2024.03.27 |
---|---|
[타입챌린지-MEDIUM] 3: Omit (0) | 2024.03.24 |
[타입챌린지-EASY] 189: Awaited (0) | 2024.03.18 |
[타입챌린지 - EASY] 14 - First of Array (0) | 2024.03.10 |
[타입챌린지 - EASY] 4 - Pick (0) | 2024.03.05 |