TypeScript 조건 유형

TypeScript의 조건부 유형은 조건에 따라 달라지는 유형을 만드는 방법을 제공합니다. 이는 유형 정의에서 더 큰 유연성과 표현력을 허용하여 복잡한 유형 관계를 명확하고 간결한 방식으로 모델링할 수 있습니다. 이 문서에서는 TypeScript에서 조건부 유형이 작동하는 방식을 살펴보고 사용 예를 보여줍니다.

조건 유형은 무엇인가요?

조건부 유형은 조건에 따라 선택된 유형을 생성할 수 있도록 합니다. 프로그래밍의 조건문과 비슷하지만 유형 수준에서 작동합니다. 조건부 유형의 기본 구문은 다음과 같습니다.

type ConditionalType = T extends U ? X : Y;

이 구문에서는:

  • 검사되는 유형은 T입니다.
  • 비교할 유형은 U입니다.
  • TU을 확장하면 반환되는 유형은 X입니다.
  • TU을 확장하지 않으면 반환되는 유형은 Y입니다.

조건형의 기본 예

다음은 주어진 유형이 문자열인지 아닌지에 따라 다양한 유형을 반환하는 조건부 유형의 간단한 예입니다.

type IsString = T extends string ? "String" : "Not a string";

type Result1 = IsString;  // Result1 is "String"
type Result2 = IsString;  // Result2 is "Not a string"

이 예에서 IsStringTstring을 확장하는지 확인합니다. 그렇다면 결과는 "String"이고, 그렇지 않으면 "Not a string"입니다.

제네릭 유형과 함께 조건 유형 사용

조건부 유형은 또한 제네릭 유형과 함께 사용하여 보다 유연하고 재사용 가능한 유형 정의를 만들 수 있습니다. 예를 들어, 함수의 반환 유형을 추출하는 유형:

type ReturnType = T extends (...args: any[]) => infer R ? R : never;

type FunctionType = (x: number) => string;

type Result = ReturnType;  // Result is string

이 예에서 ReturnTypeinfer 키워드를 사용하여 함수 유형 T의 반환 유형 R을 유추합니다. T이 함수 유형이면 ReturnType이 반환 유형이 됩니다. 그렇지 않으면 never이 기본값입니다.

Union Types를 사용한 조건 유형

조건부 유형은 또한 여러 가능한 유형을 처리하기 위해 유니온 유형과 함께 작동할 수 있습니다. 예를 들어, 서로 다른 유니온 멤버를 구별합니다.

type ExtractString = T extends string ? T : never;

type UnionType = string | number | boolean;

type Result = ExtractString;  // Result is string

이 예에서 ExtractString은 유니언 유형 UnionType에서 string을 추출하여 string을 생성합니다.

유형 매핑이 있는 조건 유형

조건부 유형은 유형 매핑과 결합하여 더 복잡한 유형 변환을 만들 수 있습니다. 예를 들어, 조건부 유형을 적용하기 위해 유형 배열을 매핑합니다.

type MapArray = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type ArrayType = [string, number, boolean];

type MappedArray = MapArray;  // MappedArray is [string, never, never]

이 예에서 MapArrayT 배열의 각 요소를 매핑하고 각 요소에 조건부 유형을 적용하여 문자열 요소만 보존되는 배열을 생성합니다.

결론

TypeScript의 조건부 유형은 유연하고 표현력이 풍부한 유형 정의를 만드는 강력한 도구입니다. 조건부 유형을 활용함으로써 개발자는 복잡한 유형 관계를 모델링하고, 다양한 시나리오를 처리하고, TypeScript 코드에서 유형 안전성을 개선할 수 있습니다. 조건부 유형을 효과적으로 사용하는 방법을 이해하면 견고하고 유지 관리가 가능한 TypeScript 코드를 작성하는 능력을 크게 향상시킬 수 있습니다.