TypeScript

[TypeScript] Omit에 대하여

수방방 2024. 7. 24. 17:00

📍 Omit 이란?

  • `Omit` 타입은 주어진 타입에서 특정 속성을 제거한 새로운 타입을 생성하는데 사용됩니다.
  • 이를 통해 코드의 재사용성을 높이고, 타입 정의를 더 유연하게 관리할 수 있습니다.

 

📍 Omit 의 기본 사용법

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
  • `T` : 원본 타입
  • `K` : 제거하고자 하는 속성의 키
  • `Omit`은 원본 타입 `T`에서 속성 `K`를 제거한 새로운 타입을 반환합니다.
  • 이를 통해 불필요한 속성을 제외하고 필요한 속성만을 가지는 타입을 정의할 수 있습니다.

 

📍 Omit 사용 예제

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

type PublicUser = Omit<User, 'password'>;

const user: PublicUser = {
  id: 1,
  name: 'John Doe',
  email: 'john.doe@example.com',
  // password 속성은 존재하지 않음
};
  • 위 예제에서 `User` 인터페이스에는 `id`, `name`, `email`, `password` 속성이 존재합니다.
  • `Omit<User, 'password'>`를 사용하여 `password` 속성을 제거한 `PublicUser` 타입을 정의했습니다.
  • 그럼 `PublicUser` 타입의 객체는 `password` 속성을 가지지 않습니다.

 

❓ 그렇다면 Optional Properties를 사용하면 되지 않을까?

  • 옵셔널 프로퍼티(`?`) 란?
    • 옵셔널 프로퍼티를 사용하면 해당 속성이 있어도 되고 없어도 되는 타입을 정의할 수 있습니다.
    • 즉, 속성이 존재할 수 있지만 없어도 에러가 발생하지 않는 타입입니다.
    • 아래 예시에서 `password` 속성은 선택적 `?` 이기 때문에 객체에 포함될수도 있고 포함되지 않을 수 있습니다.
interface User {
  id: number;
  name: string;
  email: string;
  password?: string; // 선택적 속성
}

const user1: User = {
  id: 1,
  name: 'John Doe',
  email: 'john.doe@example.com',
  // password는 없어도 됩니다.
};

const user2: User = {
  id: 2,
  name: 'Jane Doe',
  email: 'jane.doe@example.com',
  password: 'securepassword', // password가 있어도 됩니다.
};

 

 

  • 반면 `Omit` 을 사용하면 특정 속성을 완전히 제거한 새로운 타입을 정의할 수 있습니다.
    • `Omit` 사용 예시를 보면 `PublicUser` 객체는 `password` 속성을 제거한 타입이기 때문에 `password` 속성을 가질 수 없습니다.
    • 보안 및 민감 정보 관리: 예를 들어, 사용자 정보를 클라이언트로 반환할 때 비밀번호 같은 민감한 정보를 포함시키고 싶지 않을 때.
    • 타입 안전성 강화: 특정 컨텍스트에서 해당 속성이 아예 존재하지 않도록 보장하고 싶을 때. 예를 들어, 데이터베이스 레코드에서 읽어온 정보를 그대로 클라이언트로 전달하는 것이 아니라 일부 속성을 제거한 후 전달하고자 할 때.
    • 명확한 타입 정의: 선택적 속성(`?`)은 해당 속성이 존재할 수 있음을 의미합니다. 만약 해당 속성이 절대로 존재해서는 안 되는 경우 Omit을 사용하는 것이 더 명확합니다.
interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

// 클라이언트에게 전달하기 위한 타입 정의
type PublicUser = Omit<User, 'password'>;

const getUser = (userId: number): PublicUser => {
  const user: User = {
    id: userId,
    name: 'John Doe',
    email: 'john.doe@example.com',
    password: 'securepassword', // 실제 User 객체에는 password가 있음
  };

  // PublicUser 타입으로 반환 (password 속성은 제거됨)
  const { password, ...publicUser } = user;
  return publicUser;
};

const user = getUser(1);
console.log(user); // { id: 1, name: 'John Doe', email: 'john.doe@example.com' }
  • 이 예시에서는 getUser 함수가 User 객체에서 password 속성을 제거한 `PublicUser` 타입의 객체를 반환합니다.
  • 이렇게 하면 클라이언트에 비밀번호가 포함되지 않도록 보장할 수 있습니다.

 

📍 결론

  • 옵셔널 프로퍼티(`?`)는 속성이 있어도 되고 없어도 되는 경우에서 사용됩니다.
  • `Omit`은 특정 속성을 완전히 제거하여 해당 속성이 아예 존재하지 않도록 보장하고 싶을 때 사용합니다.
    • 하지만, Omit 을 너무 자주 사용하거나, 잘못된 방식으로 사용하면 오히려 코드의 복잡성을 증가시킬 수 있습니다.
    • 여러 키를 Omit 하는 경우, 해당 타입의 원래 의도가 무엇인지 파악하기 어려울 수 있습니다.
    • 반드시 필요한 경우에만 Omit 을 사용하고, 타입의 의도와 구조를 명확하게 유지하는 것이 중요합니다.