출처: Type Challenges, https://github.com/type-challenges/type-challenges/blob/main/README.ko.md
4 - Pick
T에서 K 프로퍼티만 선택해 새로운 오브젝트 타입을 만드는 내장 제네릭 Pick<T, K>을
이를 사용하지 않고 구현하세요.
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyPick<Todo, 'title' | 'completed'>
const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}
풀이
type MyPick<T, K extends keyof T> = {
[Property in K]: T[Property];
}
K가 T 타입의 key들에 대한 것이라고 제한해둔다.
이게 중요한데 테스트 코드 상에서 아래 코드가 있기 때문이다.
// @ts-expect-error
MyPick<Todo, 'title' | 'completed' | 'invalid'>,
`// @ts-expect-error` 주석 코드는 타입에 에러가 있으면 에러를 무시하고, 에러가 없다면 주석에 에러를 띄우는 주석이다.
(주석이 필요 없다는 의미로)
그런데 K에 'invalid'가 들어가있는게 보인다.
즉, T의 key가 아닌 값이 들어갔는데 주석에 빨간 줄이 뜨므로 정상적으로 작동하고 있다는 의미이다.
이를 위해서는 K 값이 T의 Key가 되도록 만들어야하기 때문에 extends keyof T가 필요하다.
[Property in K]: T[Property];
이런 대괄호 구문은 객체(중괄호) 내에서만 쓸 수 있는데
K에 있는 요소들을 하나씩 가져와서 Property에 넣어 Key로 사용하고,
T에서 Property를 Key로 Value를 가져와 Property - T[Property] 쌍으로 정의한다는 뜻이다.
즉, K에 있는 요소들을 Key로 하여 T에서 Key를 통해 Value를 가져와 새로운 타입을 만드는 것이다.
'알고리즘 > Type Challenges' 카테고리의 다른 글
18 - Length of Tuple (0) | 2023.09.06 |
---|---|
14 - First of Array (0) | 2023.09.04 |
11 - Tuple to Object (0) | 2023.09.04 |
7 - Readonly (0) | 2023.09.02 |
13 - Hello World (0) | 2023.08.22 |