2025년 03월 15일
위 이미지는 AI가 생성한 이미지입니다.
코드를 작성할 때는 명확한 기준이 필요합니다. 기준이 틀릴 수도 있지만, 일관된 기준이 있어야 올바른 방향으로 개선할 수 있습니다. 그러나 Typescript의 유틸리티 타입(Utility Types)을 사용할 때, 특히 Pick
과 Omit
을 선택할 때는 뚜렷한 기준 없이 사용하는 경우가 많습니다.
이번 글에서는 Pick
과 Omit
을 언제 어떻게 사용해야 하는지에 대한 기준을 정리하고, 원본 타입에 대한 의존성이 높을수록 Omit
을 사용하는 것이 더 안전한 선택이 될 수 있다는 것을 설명하고자 합니다.
Pick
과 Omit
을 사용하면 기존 타입 A
로부터 중복 없이 새로운 타입 B
를 정의할 수 있습니다. 이때, 새롭게 정의한 타입 B
가 타입 A
와 의존성이 높다면 Omit
을 사용하는 것이 더 안전할 수 있습니다.
예를 들어, Pick
을 사용하여 타입을 정의했다고 가정해 보겠습니다.
interface User {
id: string;
name: string;
email: string;
role: string;
}
type UserPreview = Pick<User, "id" | "name">;
위 코드에서 UserPreview
타입은 User
타입의 일부 필드(id
와 name
)만 선택한 타입입니다. 문제는 User
타입이 변경되더라도 UserPreview
는 그 변경을 자동으로 감지하지 못한다는 점입니다.
interface User {
id: string;
name: string;
email: string;
role: string;
age: number; // 새로운 필드 추가
}
위와 같이 User
타입이 변경되었지만, Pick<User, "id" | "name">
을 사용한 UserPreview
타입은 age
필드를 알지 못합니다. 만약 UserPreview
타입을 사용하는 코드에서 age
필드가 필요해진다면, 이를 반영하지 못해 실수로 빠뜨릴 가능성이 높아집니다.
반면에 Omit
을 사용하면 원본 타입이 변경될 때 타입 검사가 이를 감지할 수 있습니다.
type UserWithoutRole = Omit<User, "role">;
이제 User
타입이 변경되면 UserWithoutRole
타입도 그 변화를 자동으로 반영하게 됩니다. 즉, User
에 새로운 필드가 추가되면 Omit
을 사용한 타입도 변경되며, 해당 필드를 사용할 것인지에 대한 의사결정을 강제할 수 있습니다.
const user: UserWithoutRole = {
id: "123",
name: "Alice",
email: "[email protected]",
age: 30, // 자동으로 포함됨
};
즉, Omit
을 사용하면 원본 타입이 변경될 때 컴파일 에러를 통해 타입 변경을 인지할 수 있으며, 이를 통해 실수를 줄이고 유지보수성을 높일 수 있습니다.
기존 타입으로부터 새로운 타입을 정의할 때, 새로운 타입이 원본 타입에 강하게 의존하는 경우 Omit
을 사용하는 것이 더 안전할 수 있습니다.
Pick
을 사용하면 됩니다.Omit
을 사용하면 타입 안전성을 높일 수 있습니다.이러한 기준을 정하면 Pick
과 Omit
을 사용할 때 더 명확한 판단을 내릴 수 있으며, 유지보수가 용이한 코드를 작성하는 데 도움이 될 것입니다.