[typescript] 타입 가드와 조건부 타입
  1. 타입 가드란 무엇인가요?
  2. 타입 가드 활용하기
  3. 조건부 타입 소개
  4. 조건부 타입 사용하기

타입 가드란 무엇인가요?

타입스크립트에서 타입 가드(Type Guard) 는 런타임에서의 조건문을 통해 변수의 타입을 추론하는 것을 도와줍니다. 주로 typeof, instanceof, 혹은 사용자 정의 함수를 활용하여 변수의 타입을 확인합니다.

예를 들어, 다음과 같이 typeof를 이용하여 변수의 타입을 확인할 수 있습니다.

function printMessage(message: string | number) {
    if (typeof message === 'string') {
        console.log(message.toUpperCase());
    } else {
        console.log(message);
    }
}

이렇게 타입 가드를 사용하면 런타임에서 message 변수가 string인지 number인지를 확인할 수 있습니다.

타입 가드 활용하기

사용자 정의 함수를 이용한 타입 가드 역시 유용합니다. 아래 예시는 circlerectangle이라는 두 가지 형태를 가진 도형을 다루는 함수입니다.

interface Circle {
    kind: 'circle';
    radius: number;
}

interface Rectangle {
    kind: 'rectangle';
    width: number;
    height: number;
}

type Shape = Circle | Rectangle;

function getArea(shape: Shape) {
    if (shape.kind === 'circle') {
        return Math.PI * shape.radius ** 2;
    } else {
        return shape.width * shape.height;
    }
}

위 예시에서 kind 속성을 활용하여 shape의 타입을 가드합니다. 이를 통해 런타임에서 각 도형의 면적을 계산할 수 있습니다.

조건부 타입 소개

타입스크립트에서 조건부 타입(Conditional Types) 은 입력된 타입에 따라 타입을 변화시키는 데 활용됩니다. T extends U ? X : Y 형태로 사용되며, TU에 할당 가능하다면 X 타입으로, 그렇지 않다면 Y 타입으로 해석됩니다.

예를 들어, Exclude 타입은 특정 타입 U에서 다른 타입 T를 제외하는 역할을 합니다.

type MyExclude<T, U> = T extends U ? never : T;
type Result = MyExclude<"a" | "b" | "c", "a" | "c">; // "b"

위 예시에서 MyExclude 타입은 TU에 할당되지 않는 경우에만 T를 반환하도록 정의되어 있습니다.

조건부 타입 사용하기

조건부 타입을 활용하면 자주 발생하는 문제를 간단히 해결할 수 있습니다. 예를 들어, 매개변수가 특정 타입에 따라 다른 타입의 반환값을 갖는 함수를 정의하고 싶을 때 조건부 타입을 사용할 수 있습니다.

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

function getValue(val: string | number): ReturnType<typeof val.toUpperCase> {
    if (typeof val === 'string') {
        return val.toUpperCase();
    } else {
        return val;
    }
}

getValue 함수에서 매개변수 valstring 타입일 경우 val.toUpperCase의 반환값은 string이 되고, 그 외의 경우에는 number가 반환됩니다.

조건부 타입은 타입스크립트에서 강력하고 유연한 기능으로, 다양한 상황에서 유용하게 활용될 수 있습니다.

참고 자료