출처: Type Challenges, https://github.com/type-challenges/type-challenges/blob/main/README.ko.md
3 - Omit
`T`에서 `K` 프로퍼티만 제거해 새로운 오브젝트 타입을 만드는 내장 제네릭 `Omit<T, K>`를
이를 사용하지 않고 구현하세요.
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyOmit<Todo, 'description' | 'title'>
const todo: TodoPreview = {
completed: false,
}
풀이
type MyOmit<T, K extends keyof T> = {
[P in keyof T as P extends K ? never : P]: T[P]
}
대부분은 Pick에서 사용했던 방법인데 문제는 P 중에서 K만 빼고 다시 작성해야한다는 부분이다.
이는 TypeScript의 as 연산자를 통해 가능한데 객체 Key 부분에서 as를 사용하면 키를 다시 매핑할 수 있다.
즉, P에서 K를 제외하고 싶다면, as를 통해 P를 다시 매핑해 P가 K에 할당가능한 경우에 never를 통해서 제거해버리면 된다.
type MyOmit<T, K extends keyof T> = {
[P in Exclude<keyof T, K>]: T[P]
}
물론 Exclude를 이용해 이런 풀이도 가능하다.
'알고리즘 > Type Challenges' 카테고리의 다른 글
8 - Readonly 2 (0) | 2023.09.17 |
---|---|
2 - Get Return Type (0) | 2023.09.17 |
898 - Includes (0) | 2023.09.17 |
3312 - Parameters (0) | 2023.09.17 |
3060 - Unshift (0) | 2023.09.17 |