dev-hamster
[type-challenges] easy 01-05 본문
PICK-4
pick을 사용하지 않고 Pick을 구현하는 문제이다.
keyof는 객체의 키 값들을 숫자나 문자열 리터럴 유니언을 생성한다.in는 객체에 특정 속성이 존재하는지 확인할 수 있다.
K extends keyof T K는 T의 프로퍼티 이름을 가진다. 매핑된 타입을 이용하면 키를 통해 타입을 반복적으로 생성할 수 있고 인덱스 시그니처 문법으로 작성하면 된다.
type MyPick<T, K extends keyof T> = {
[k in K]: T[k]
}Readonly
Readonly 타입을 사용하지 않고 구현하는 문제이다.
readonly는 프로퍼티를 읽기 전용으로 지정할 수 있다.
type MyReadonly<T> = {
readonly [P in keyof T]: T[P]
}Tuple to Object
각 원소의 값을 key/value로 갖는 오브젝트 타입을 반환하는 타입을 구현하는 문제이다.
// 배열의 원소의 값을 key/value로 갖는 타입을 반환한다.
['tesla', 'model 3', 'model X', 'model Y']
{ 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}- 배열 순회하기:
T[number]을 통해 배열을 순회하여 타입을 가져올 수 있다.T[number]은 인덱스가 숫자형인 요소들의 타입을 가져오므로 배열에 있는 모든 요소의 타입을 가져올 수 있다. - PropertyKey:
keyof를 통해 생성되는 key의 집합이다. 여기에는 string, number, symbol이 있다.
type TupleToObject<T extends readonly PropertyKey[]> = {
[P in T[number]] : P
}First of Array
T를 받아 첫번째 원소의 타입을 반환하는 제네릭 First<T>를 구현하는 문제이다.
- 조건부 타입: 배열이 빈 배열이라면
never타입을 반환한다.
// 오답: 빈 배열인 경우 T[0]은 undefeind가 된다
type First<T extends any[]> = T[0] extends never ? never : T[0]; // 원소가 없다면 never 타입 반환
// 정답1
type First<T extends unknown[]> = T[number] extends never ? never : T[0];
// 정답2
type First<T extends unknown[]> = T extends [] ? never : T[0]; Length of Tuple
튜블(배열)의 길이를 반환하는 제네릭 타입을 구현하는 문제이다.
readonly: 튜플은 고정된 요소를 저장하므로 readonly이다.
T extends readonly unknown[] 에서 T가 배열 타입인지 조건부로 타입을 할당한다. 이런 경우 배열이 아닌 경우 never를 반환하기 때문에 타입 에러가 나지 않는다.
// 오답: Length<5>인 경우 타입 에러가 나지 않는다.
type Length<T> = T extends readonly unknown[] ? T['length'] : never; <T extends readonly unknown[]> 는 T가 readonly unknown[ ]이라는 타입을 반드시 만족해야 하므로 배열이 아닌 경우 타입 에러를 발생한다.
// 정답
type Length<T extends readonly unknown[]> = T["length"];'타입스크립트 > type-challenges' 카테고리의 다른 글
| [type-challenges] medium 10-13 (0) | 2024.10.22 |
|---|---|
| [type-chllenges] medium 05-08 (2) | 2024.10.22 |
| [type-challenges] medium 01-04 (0) | 2024.10.17 |
| [type-challengs] easy 10-14 (0) | 2024.10.12 |
| [type-challenges] easy 06-09 (1) | 2024.10.11 |