Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Archives
Today
Total
관리 메뉴

효뚜르팝의 Dev log

[Type-Challenges] Pick, Readonly, Tuple to Object, First of Array, Length of Array, Length of Tuple, Exclude 본문

TIL

[Type-Challenges] Pick, Readonly, Tuple to Object, First of Array, Length of Array, Length of Tuple, Exclude

hyodduru 2024. 6. 9. 17:14

1. Pick 

T에서 K 프로퍼티만 선택해 새로운 오브젝트 타입을 만드는 내장 제네릭 Pick<T, K>을 이를 사용하지 않고 구현하세요.

 

풀이

type MyPick<T, K extends keyof T> = { [P in K]: T[P]; };

 

  • T : Type 
  • K : Key 
  • Pick : 주어진 타입 T에서 특정 프로퍼티 K만 선택해 새로운 타입을 만드는 역할을 함. 
  • K extends keyof T: K는 T 타입의 키들의 유니온 타입 중 일부.
  • [P in K]: T[P]: P는 K의 각 요소를 나타내며, 결과 타입의 프로퍼티로 사용됨. T[P]는 T 타입에서 P 키에 해당하는 프로퍼티 타입을 나타냄. 

 

 

참고) 

in : TypeScript에서 in 키워드는 매핑된 타입(mapped types)을 정의할 때 사용

     -> P in K를 통해, K의 유니온 타입들을 순회하고 있음. 

 

 

2. ReadOnly 

T의 모든 프로퍼티를 읽기 전용(재할당 불가)으로 바꾸는 내장 제네릭 Readonly<T>를 이를 사용하지 않고 구현하세요.

 

풀이 

type MyReadonly<T> = {
  readonly [P in keyof T]: T[P];
};

 

 

  • readonly [P in keyof T]: T[P]는 각 프로퍼티 P를 읽기 전용으로 만들고, T[P]는 T 타입의 해당 프로퍼티 타입을 가져옴 

3. Tuple to Object 

배열(튜플)을 받아, 각 원소의 값을 key/value로 갖는 오브젝트 타입을 반환하는 타입을 구현하세요.

 

풀이

type TupleToObject<T extends readonly any[]> = {
  [K in T[number]: K
};

 

 

 

  • T extends readonly any[]: 입력으로 받는 튜플의 타입을 제한. readonly any[]는 임의의 타입의 읽기 전용 배열을 나타냄.
  • T[number]: 튜플의 각 원소의 타입을 나타냄. 
  • [K in T[number]]: K: 매핑된 타입을 사용하여 각 튜플의 원소에 대해 반복합니다. 이 때 K는 각 원소의 값이 됩니다. 따라서 K를 키로 사용하여 각 원소의 값을 나타내는 객체를 만듬 

4. First Of Array 

배열(튜플) `T`를 받아 첫 원소의 타입을 반환하는 제네릭 `First<T>`를 구현하세요.

 

풀이

type First<T extends any[]> = T extends [] ? never : T[0]

 

 

  • T extends []: 입력으로 받는 배열 T가 비어있는지 여부를 확인한다.  만약 T가 비어있다면 이 경우에는 첫 번째 원소가 존재하지 않기 때문에 never 타입을 반환한다. 
  • T[0]: 그렇지 않은 경우, 즉, T가 비어있지 않은 배열인 경우, 첫 번째 원소의 타입을 가져온다. 

 

5. Length Of Tuple 

배열(튜플)을 받아 길이를 반환하는 제네릭 `Length<T>`를 구현하세요.

 

풀이

type Length<T extends readonly any[]> = T['length']

 

  • T extends readonly any[]: 입력으로 받는 타입 T가 배열이거나 튜플임을 보장함.  
  • T['length']: TypeScript의 인덱스 타입을 사용하여 배열의 길이를 가져온다. 

6. Exclude 

T에서 U에 할당할 수 있는 타입을 제외하는 내장 제네릭 Exclude<T, U>를 이를 사용하지 않고 구현하세요.



풀이

type MyExclude<T, U> = T extends U ? never : T;

 

  • T extends U ? never : T: 조건부 타입을 사용하여 T가 U에 할당할 수 있는 타입인지 확인한다. 만약 T가 U에 할당할 수 있는 타입이라면 never 타입을 반환하여 제외한다. 
  • never : TypeScript에서 절대 발생하지 않는 값