고급 TypeScript - 고급 타입: 조건부 타입
고급 타입: 조건부 타입
조건부 타입은 TypeScript에서 매우 강력하고 유용한 기능으로, 특정 조건에 따라 타입을 결정할 수 있게 해줍니다. 이는 마치 프로그래밍의 if
문과 비슷하게 작동하며, 코드의 재사용성과 가독성을 높이는 데 기여합니다.
기본 개념
조건부 타입은 다음과 같은 형식으로 정의됩니다:
T extends U ? X : Y
- T는 검사할 타입입니다.
- U는 비교 대상이 되는 타입입니다.
- X는 T가 U를 확장하는 경우 반환되는 타입입니다.
- Y는 T가 U를 확장하지 않는 경우 반환되는 타입입니다.
즉, 만약 T
가 U
와 일치하거나 그 하위 유형인 경우에는 X
를 반환하고, 그렇지 않으면 Y
를 반환합니다.
예제 1: 기본 조건부 타입
다음은 간단한 조건부 타이프의 예시입니다:
type IsString<T> = T extends string ? "문자열" : "문자열 아님";
type A = IsString<string>; // "문자열"
type B = IsString<number>; // "문자열 아님"
위의 예제에서 IsString
이라는 조건부 타이프를 정의했습니다. 이타입은 입력된 값(T)이 문자열인지 아닌지를 검사하여 결과를 반환합니다.
예제 2: 여러 가지 조건 결합하기
조건부 타이프는 복잡한 로직을 구현하는 데도 사용할 수 있습니다. 다음은 두 개 이상의 조건을 결합하여 사용하는 방법입니다:
type CheckType<T> =
T extends string ? "문자열" :
T extends number ? "숫자" :
T extends boolean ? "불리언" :
"기타";
type Result1 = CheckType<string>; // "문자열"
type Result2 = CheckType<number>; // "숫자"
type Result3 = CheckType<boolean>; // "불리언"
type Result4 = CheckType<undefined>; // "기타"
여기서는 다양한 데이터 유형에 대해 각각 다른 결과 값을 제공하는 CheckType
이라는 복잡한 구조의 조건부 타이프를 만들었습니다.
예제 3: 제네릭과 함께 사용하기
조건부 타이프는 제네릭과 함께 사용할 때 더욱 강력해집니다. 아래 코드는 어떤 객체가 특정 속성을 가지고 있는지를 체크하는 함수의 예시입니다:
interface User {
name: string;
}
function getUserName<T>(user: T): T extends User ? string : null {
return (user as User).name || null;
}
// 사용예:
const userA = { name: 'Alice' };
const userB = { age: 30 };
const nameA = getUserName(userA); // 'Alice'
const nameB = getUserName(userB); // null
위 코드에서는 주어진 객체가 User
인터페이스를 따르는지 여부에 따라 이름을 가져오거나 null을 반환하도록 설정했습니다.
요약
조건부 타이프는 TypeScript에서 유연하고 동적인 방식으로 데이터를 처리할 수 있게 해주는 중요한 도구입니다. 이를 통해 개발자는 보다 안전하고 유지보수 가능한 코드를 작성할 수 있으며, 다양한 상황에서도 적절히 대응할 수 있는 구조적인 접근 방식을 취할 수 있습니다.