고급 TypeScript - 유틸리티 타입: Partial

유틸리티 타입: Partial

유틸리티 타입은 TypeScript에서 제공하는 내장된 타입 변환 도구로, 객체의 속성을 쉽게 조작할 수 있게 해줍니다. 그 중에서도 Partial은 특정 인터페이스의 모든 속성을 선택적으로 만들 수 있는 기능을 제공합니다. 즉, 어떤 객체가 특정 인터페이스를 따르더라도 일부 속성만 정의해도 괜찮도록 허용합니다.

1. Partial의 개념

  • 기본 아이디어: Partial는 제네릭 타입으로, T라는 인터페이스를 받아서 모든 속성을 선택적으로 만듭니다.
  • 목적: 이 기능은 주로 객체를 업데이트하거나 변경할 때 유용합니다. 예를 들어, 사용자의 프로필 정보를 업데이트할 때 전체 정보를 제공하지 않고 필요한 부분만 보낼 수 있습니다.

2. 사용 예제

다음은 User라는 인터페이스와 이를 기반으로 한 Partial<User> 예제입니다.

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

// Partial<User>를 사용하는 함수
function updateUser(id: number, userUpdates: Partial<User>) {
    // 여기서 userUpdates는 User의 일부 속성만 포함될 수 있습니다.
    console.log(`Updating user with ID ${id}...`);
    
    if (userUpdates.name) {
        console.log(`New Name: ${userUpdates.name}`);
    }
    
    if (userUpdates.email) {
        console.log(`New Email: ${userUpdates.email}`);
    }
}

// 사용자 정보 업데이트 호출
updateUser(1, { name: "Alice" }); // 이름만 업데이트
updateUser(2, { email: "bob@example.com" }); // 이메일만 업데이트

위 코드에서 updateUser 함수는 Partial<User>를 통해 name이나 email 중 하나 또는 둘 다 없이 호출될 수 있음을 보여줍니다. 이는 매우 유연한 방법이며 특히 대규모 애플리케이션에서 데이터 관리에 큰 도움이 됩니다.

3. 실전 활용 사례

  • API 요청 처리:

    • RESTful API에서는 PATCH 메소드를 사용할 때 전체 리소스를 보내지 않고 수정하고자 하는 필드만 전송하는 경우가 많습니다.

      // API 응답 처리 함수 예시
      function handleApiResponse(responseData: Partial<User>) {
         // responseData에는 필요 없는 필드는 포함되지 않을 수 있음 
      }
      
  • 폼 처리:

    • 사용자 입력을 기반으로 폼 데이터를 구성할 때도 각 필드에 대해 선택적으로 값을 설정할 수 있습니다.

      type FormFields = {
         username?: string;
         password?: string;
      };
      
      // 폼 제출 시 호출되는 함수
      function submitForm(fields: Partial<FormFields>) {
         // fields는 username과 password 중 일부만 가질 수도 있음 
      }
      

4. 요약

Partial 는 TypeScript에서 매우 강력한 도구로써 다양한 상황에서 객체의 구조를 유연하게 다룰 수 있도록 돕습니다. 이를 통해 개발자는 더 간결하고 유지보수가 쉬운 코드를 작성할 수 있으며, 특히 동적이고 변화하는 데이터 구조에 적합합니다.

Subscribe to shimdh.log

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe