카테고리 없음

TypeScript 유틸리티 타입(Partial, Pick, Omit 등) 실무 적용법 (18강)

mystory55776 2025. 5. 18. 20:54

TypeScript 유틸리티 타입(Partial, Pick, Omit 등) 실무 적용법 (18강)

**TypeScript**는 강력한 **타입 시스템**을 제공하며, 그 중 **유틸리티 타입**은 타입 변형을 간편하게 할 수 있도록 돕는 유용한 기능입니다. **Partial**, **Pick**, **Omit**과 같은 유틸리티 타입을 활용하면 복잡한 타입 변환을 손쉽게 처리할 수 있습니다. 이번 강의에서는 **TypeScript 유틸리티 타입**의 개념을 이해하고, 이를 **실무 프로젝트**에서 어떻게 활용할 수 있는지에 대해 알아보겠습니다.

TypeScript 유틸리티 타입이란?

**유틸리티 타입**은 **TypeScript**에서 제공하는 내장 타입으로, 특정 타입을 변형하거나 처리하는 데 유용한 도구입니다. 이 타입들은 복잡한 타입을 다룰 때 **코드의 간결성**과 **재사용성**을 높여주며, 특히 **타입 추론**을 개선하고, **동적 타입 변환**을 손쉽게 처리할 수 있습니다.

주로 사용되는 **유틸리티 타입**에는 **`Partial`**, **`Pick`**, **`Omit`** 등이 있습니다. 각 타입은 **기존 타입을 변형**하거나 **일부 속성을 추출**하는 데 유용하게 사용됩니다.

1. Partial: 일부 속성을 선택적으로 만들기

**`Partial`**는 **주어진 타입 T**의 모든 속성을 **선택적으로** 만들어주는 유틸리티 타입입니다. 이를 통해, **객체의 일부 속성만을 업데이트**할 수 있는 유연한 코드 작성이 가능합니다.

Partial 예제

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

function updateUser(id: number, user: Partial) {
  // 사용자가 전달한 부분적인 값만 업데이트
  console.log(id, user);
}

updateUser(1, { name: "John Doe" });  // name만 업데이트
updateUser(2, { email: "newemail@example.com" });  // email만 업데이트

위 예제에서 **Partial**는 **User** 객체의 모든 속성을 선택적으로 처리할 수 있게 만들어줍니다. 즉, `updateUser` 함수는 **전체 객체**를 받지 않고 **일부 속성만** 받을 수 있습니다.

2. Pick: 일부 속성만 추출하기

**`Pick`**은 **타입 T**에서 **속성 K**만 선택하여 새로운 타입을 생성하는 유틸리티 타입입니다. 이를 통해, 필요한 **속성만 추출**하여 사용하고, 다른 속성은 제외할 수 있습니다.

Pick 예제

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

type UserName = Pick;

const user: UserName = { name: "Alice" };  // name만 추출

위 예제에서 **Pick**는 **User** 타입에서 `name` 속성만 추출하여 새로운 타입 **UserName**을 생성합니다. 이렇게 특정 속성만 필요한 경우, 다른 속성을 제외하고 필요한 부분만 사용하게 할 수 있습니다.

3. Omit: 일부 속성 제외하기

**`Omit`**은 **타입 T**에서 특정 속성 **K**를 제외한 새로운 타입을 생성하는 유틸리티 타입입니다. 이를 통해 **불필요한 속성**을 제외하고 필요한 속성만 남길 수 있습니다.

Omit 예제

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

type UserWithoutEmail = Omit;

const user: UserWithoutEmail = { id: 1, name: "Bob" };  // email 속성 제외

위 예제에서 **Omit**은 **User** 타입에서 `email` 속성을 제외한 새로운 타입을 만듭니다. 이렇게 특정 속성을 **제외**하고 나머지 속성만 사용할 수 있습니다.

4. 다른 유틸리티 타입들

TypeScript에서는 **Partial**, **Pick**, **Omit** 외에도 다양한 유틸리티 타입들이 존재합니다. 이들을 잘 활용하면, 복잡한 타입 변환 작업을 더욱 효율적으로 처리할 수 있습니다.

1) Required

**`Required`**는 **타입 T**의 모든 속성을 **필수**로 만드는 유틸리티 타입입니다. 이 타입을 사용하면 **Optional 속성**을 강제로 필수 속성으로 변경할 수 있습니다.

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

type RequiredUser = Required;

const user: RequiredUser = { id: 1, name: "Alice", email: "alice@example.com" };  // 모든 속성이 필수

2) Readonly

**`Readonly`**는 **타입 T**의 모든 속성을 **읽기 전용**으로 만들어주는 유틸리티 타입입니다. 이를 사용하면 객체의 속성을 수정할 수 없게 할 수 있습니다.

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

type ReadonlyUser = Readonly;

const user: ReadonlyUser = { id: 1, name: "Alice" };
// user.name = "Bob";  // 오류: 읽기 전용 속성은 수정할 수 없습니다.

3) Exclude / Extract

**`Exclude`**는 타입 **T**에서 타입 **U**에 속한 부분을 제외한 타입을 생성하고, **`Extract`**는 타입 **T**에서 타입 **U**에 속한 부분만 추출하는 유틸리티 타입입니다.

type MyType = Exclude<"a" | "b" | "c", "a">;  // "b" | "c"
type MyType2 = Extract<"a" | "b" | "c", "a" | "b">;  // "a" | "b"

5. 실무에서 유틸리티 타입 활용하기

**TypeScript 유틸리티 타입**을 활용하면 복잡한 타입을 간단하게 변형할 수 있어, **실무 프로젝트**에서 매우 유용하게 사용됩니다. 예를 들어, **API 요청/응답 객체**를 처리할 때, **Partial**을 사용하여 **선택적인 속성**을 처리하거나, **Pick**과 **Omit**을 사용하여 **특정 속성만 추출하거나 제외**할 수 있습니다.

실무 예제: API 응답 데이터 처리

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

interface ApiResponse {
  data: T;
  error?: string;
}

type UserResponse = ApiResponse;

const userApiResponse: UserResponse = {
  data: { id: 1, name: "Alice", email: "alice@example.com" },
};

function getUserData(response: ApiResponse>) {
  if (response.error) {
    console.log("Error:", response.error);
  } else {
    console.log("User data:", response.data);
  }
}

getUserData({ data: { name: "Alice" } });  // 이름만 포함된 응답

위 예제에서는 **Partial**을 활용하여 **API 응답 데이터**에서 **일부 속성만 포함된 객체**를 처리하고 있습니다. **Omit**을 사용하여 특정 속성을 제외하거나, **Pick**을 사용하여 필요한 데이터만 추출하는 방식으로 유틸리티 타입을 적극적으로 활용할 수 있습니다.

결론

**TypeScript 유틸리티 타입**은 **타입 변형**을 간편하게 할 수 있는 유용한 도구로, **대규모 프로젝트**에서 코드의 **유연성**과 **유지보수성**을 높이는 데 큰 도움이 됩니다. **Partial**, **Pick**, **Omit**을 비롯한 다양한 유틸리티 타입을 실무에서 적절히 활용하여, 코드의 복잡도를 줄이고 가독성을 높일 수 있습니다. 이 강의를 통해 유틸리티 타입을 **효율적으로 활용**하는 방법을 익히고, 프로젝트에 적용해 보세요.