타입스크립트에서 조건부 타입(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
인 경우 해당하는 제네릭 타입을 반환하도록 정의되어 있습니다.
조건부 타입을 활용하여 코드를 보다 유연하게 작성할 수 있으며, 타입 별칭과 인터페이스를 활용하여 중복을 방지하고 가독성이 높은 코드를 작성할 수 있습니다. 이러한 기능은 타입스크립트의 강력한 기능 중 하나로, 복잡한 타입을 다룰 때 매우 유용하게 활용될 수 있습니다.
결론
타입 별칭과 인터페이스를 사용하여 조건부 타입을 정의하면 코드의 유연성을 높일 수 있고, 가독성 있고 유지 보수가 쉬운 코드를 작성할 수 있습니다. 이러한 기능을 적절히 활용하여 타입 안정성을 높이고 개발 생산성을 향상시킬 수 있습니다.
참고 자료: