keepmhwn

Pick vs Omit 원본 타입 의존성에 따른 올바른 선택법-thumbnail

Pick vs Omit 원본 타입 의존성에 따른 올바른 선택법

2025년 03월 15일


위 이미지는 AI가 생성한 이미지입니다.


시작하며

코드를 작성할 때는 명확한 기준이 필요합니다. 기준이 틀릴 수도 있지만, 일관된 기준이 있어야 올바른 방향으로 개선할 수 있습니다. 그러나 Typescript의 유틸리티 타입(Utility Types)을 사용할 때, 특히 PickOmit을 선택할 때는 뚜렷한 기준 없이 사용하는 경우가 많습니다.


이번 글에서는 PickOmit을 언제 어떻게 사용해야 하는지에 대한 기준을 정리하고, 원본 타입에 대한 의존성이 높을수록 Omit을 사용하는 것이 더 안전한 선택이 될 수 있다는 것을 설명하고자 합니다.



의존성이 높을수록 Omit 사용하기

PickOmit을 사용하면 기존 타입 A로부터 중복 없이 새로운 타입 B를 정의할 수 있습니다. 이때, 새롭게 정의한 타입 B가 타입 A와 의존성이 높다면 Omit을 사용하는 것이 더 안전할 수 있습니다.


Pick을 사용할 때 발생할 수 있는 문제

예를 들어, Pick을 사용하여 타입을 정의했다고 가정해 보겠습니다.

interface User {
  id: string;
  name: string;
  email: string;
  role: string;
}
 
type UserPreview = Pick<User, "id" | "name">;

위 코드에서 UserPreview 타입은 User 타입의 일부 필드(idname)만 선택한 타입입니다. 문제는 User 타입이 변경되더라도 UserPreview는 그 변경을 자동으로 감지하지 못한다는 점입니다.

interface User {
  id: string;
  name: string;
  email: string;
  role: string;
  age: number; // 새로운 필드 추가
}

위와 같이 User 타입이 변경되었지만, Pick<User, "id" | "name">을 사용한 UserPreview 타입은 age 필드를 알지 못합니다. 만약 UserPreview 타입을 사용하는 코드에서 age 필드가 필요해진다면, 이를 반영하지 못해 실수로 빠뜨릴 가능성이 높아집니다.


Omit을 사용하면 어떻게 다를까?

반면에 Omit을 사용하면 원본 타입이 변경될 때 타입 검사가 이를 감지할 수 있습니다.

type UserWithoutRole = Omit<User, "role">;

이제 User 타입이 변경되면 UserWithoutRole 타입도 그 변화를 자동으로 반영하게 됩니다. 즉, User에 새로운 필드가 추가되면 Omit을 사용한 타입도 변경되며, 해당 필드를 사용할 것인지에 대한 의사결정을 강제할 수 있습니다.

const user: UserWithoutRole = {
  id: "123",
  name: "Alice",
  email: "[email protected]",
  age: 30, // 자동으로 포함됨
};

즉, Omit을 사용하면 원본 타입이 변경될 때 컴파일 에러를 통해 타입 변경을 인지할 수 있으며, 이를 통해 실수를 줄이고 유지보수성을 높일 수 있습니다.



마치며

기존 타입으로부터 새로운 타입을 정의할 때, 새로운 타입이 원본 타입에 강하게 의존하는 경우 Omit을 사용하는 것이 더 안전할 수 있습니다.

이러한 기준을 정하면 PickOmit을 사용할 때 더 명확한 판단을 내릴 수 있으며, 유지보수가 용이한 코드를 작성하는 데 도움이 될 것입니다.