Type Challenges

Omit

#TypeScript

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를 이용해 이런 풀이도 가능하다.

Reference

Type Challenges, 3 - Omit