고급 TypeScript - 고급 타입: 조건부 타입

고급 타입: 조건부 타입

조건부 타입은 TypeScript에서 매우 강력하고 유용한 기능으로, 특정 조건에 따라 타입을 결정할 수 있게 해줍니다. 이는 마치 프로그래밍의 if 문과 비슷하게 작동하며, 코드의 재사용성과 가독성을 높이는 데 기여합니다.

기본 개념

조건부 타입은 다음과 같은 형식으로 정의됩니다:

T extends U ? X : Y
  • T는 검사할 타입입니다.
  • U는 비교 대상이 되는 타입입니다.
  • X는 T가 U를 확장하는 경우 반환되는 타입입니다.
  • Y는 T가 U를 확장하지 않는 경우 반환되는 타입입니다.

즉, 만약 TU와 일치하거나 그 하위 유형인 경우에는 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에서 유연하고 동적인 방식으로 데이터를 처리할 수 있게 해주는 중요한 도구입니다. 이를 통해 개발자는 보다 안전하고 유지보수 가능한 코드를 작성할 수 있으며, 다양한 상황에서도 적절히 대응할 수 있는 구조적인 접근 방식을 취할 수 있습니다.

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