[typescript] 타입 별칭과 인터페이스를 사용하여 조건부 타입 정의하기

타입스크립트에서 조건부 타입(conditional types)은 매우 강력한 기능으로, 여러 타입에 대한 조건부적인 동작을 정의할 수 있습니다. 이러한 조건부 타입을 정의할 때에는 type 키워드를 사용한 타입 별칭(Type Alias) 또는 interface 키워드를 사용한 인터페이스(Interface)를 활용할 수 있습니다.

타입 별칭과 조건부 타입

타입 별칭을 사용하여 조건부 타입을 정의해보겠습니다.

type NonNullable<T> = T extends null | undefined ? never : T;
type TNonNullable = NonNullable<string | null | undefined>; // 결과: string

위 예제에서 NonNullable 이라는 타입 별칭을 정의하여, 입력된 타입이 null 또는 undefined일 경우 never를 반환하고, 그렇지 않다면 입력된 타입을 그대로 반환하도록 정의되어 있습니다. 따라서 TNonNullable의 결과는 string이 됩니다.

인터페이스와 조건부 타입

인터페이스를 사용하여 조건부 타입을 정의할 수도 있습니다.

interface ErrorHandling {
  success: boolean;
  error?: { message: string };
}

interface ArtistsData {
  name: string;
  genre: string;
}

interface ApiResponse<T> {
  status: number;
  type: T;
}

type ApiResult<T> = T extends ErrorHandling ? never : T extends ApiResponse<infer U> ? U : T;

const handleApiResponse = (response: ApiResult<ArtistsData | ErrorHandling>) => {
  if (response.success) {
    // handle success
    const data: ArtistsData = response;
    console.log(data);
  } else {
    // handle error
    const error: ErrorHandling = response;
    console.error(error.error?.message);
  }
};

위 예제에서는 ApiResult라는 인터페이스를 정의하여, 입력된 타입이 ErrorHandling인 경우 never를 반환하고, 입력된 타입이 ApiResponse인 경우 해당하는 제네릭 타입을 반환하도록 정의되어 있습니다.

조건부 타입을 활용하여 코드를 보다 유연하게 작성할 수 있으며, 타입 별칭과 인터페이스를 활용하여 중복을 방지하고 가독성이 높은 코드를 작성할 수 있습니다. 이러한 기능은 타입스크립트의 강력한 기능 중 하나로, 복잡한 타입을 다룰 때 매우 유용하게 활용될 수 있습니다.

결론

타입 별칭과 인터페이스를 사용하여 조건부 타입을 정의하면 코드의 유연성을 높일 수 있고, 가독성 있고 유지 보수가 쉬운 코드를 작성할 수 있습니다. 이러한 기능을 적절히 활용하여 타입 안정성을 높이고 개발 생산성을 향상시킬 수 있습니다.

참고 자료: