dev-hamster

[type-challenges] easy 01-05 본문

타입스크립트/type-challenges

[type-challenges] easy 01-05

dev-hamster 2024. 10. 11. 00:25

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