챌린지

내장 타입인 Omit<T, K> 제네릭을 직접 구현해보세요. 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> = { [P in keyof T]: T[P] };

T의 모든 키를 순회하며 새 오브젝트 타입의 키인 P로 만들고 값이 되는 타입은 T[P]가 됩니다.

모든 키를 순회하는 과정에서 필요하지 않은 키에 대해서는 필터링을 하고 싶습니다. 이를 위해 “as” 문법을 사용한 키 리매핑을 할 수 있습니다:

type MyOmit<T, K> = { [P in keyof T as P extends K ? never : P]: T[P] };

T의 모든 프로퍼티를 매핑하면서 프로퍼티가 K 유니온에 속할 경우 키의 타입이 never를 반환하게 했습니다. 위 방식으로 특정 프로퍼티를 필터링하고 필요한 오브 젝트 타입을 얻을 수 있습니다.

참고