[typescript] 타입 가드와 인터섹션 타입을 사용하여 복합 조건을 처리하는 방법

프로그래밍을 하다 보면 여러 가지 조건을 처리해야 하는 경우가 많습니다. TypeScript에서는 이러한 복합적인 조건을 처리하기 위해 타입 가드(type guard)인터섹션 타입(intersection type)을 활용할 수 있습니다. 이 글에서는 이 두 가지 기능을 사용하여 복합적인 조건을 처리하는 방법에 대해 살펴보겠습니다.

타입 가드란 무엇인가?

타입 가드란 런타임에서의 조건문을 통해 변수의 타입을 좁혀주는 TypeScript의 기능입니다. 이를 사용하면 조건에 따라 다른 타입으로 동작하는 함수를 안전하게 구현할 수 있습니다.

예를 들어, 다음과 같은 인터페이스와 함수가 있다고 가정해봅시다.

interface Bird {
  fly(): void;
}

interface Fish {
  swim(): void;
}

function getPet(): Bird | Fish {
  // ...
}

위 코드에서 getPet 함수는 BirdFish를 반환할 수 있습니다. 이때 반환된 객체가 Bird인지 Fish인지 확인하기 위해 타입 가드를 사용할 수 있습니다.

function isFish(pet: Bird | Fish): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

let pet = getPet();
if (isFish(pet)) {
  pet.swim();
} else {
  pet.fly();
}

위 코드에서 isFish 함수는 주어진 객체가 Fish 타입인지 확인하여 pet is Fish 형태로 반환합니다. 이후 isFish 함수를 통해 반환된 객체가 Fish 타입인지 확인하고, 그에 따라 다른 동작을 수행합니다.

인터섹션 타입을 활용한 조건 처리

인터섹션 타입을 사용하면 두 개 이상의 타입을 결합하여 새로운 타입을 생성할 수 있습니다. 이를 활용하면 다양한 조건을 만족하는 객체를 다룰 때 유용합니다.

예를 들어, 다음과 같이 두 개의 인터페이스가 있다고 가정해봅시다.

interface A {
  foo: number;
}

interface B {
  bar: string;
}

AB의 인터페이스를 모두 만족하는 객체를 다루기 위해 인터섹션 타입을 사용할 수 있습니다.

type IntersectionType = A & B;

function processObject(obj: IntersectionType) {
  // ...
}

위 코드에서 IntersectionTypeAB의 모든 속성을 포함하는 타입으로, processObject 함수를 통해 이러한 조건을 만족하는 객체를 안전하게 다룰 수 있습니다.

결론

타입 가드와 인터섹션 타입을 활용하면 복합적인 조건을 안전하게 처리할 수 있습니다. 타입 가드를 사용하여 조건에 따라 다른 타입으로 동작하는 함수를 구현하고, 인터섹션 타입을 사용하여 다양한 조건을 만족하는 객체를 다룰 수 있습니다. 이를 통해 타입 시스템의 안전성을 유지하면서도 유연한 코드를 작성할 수 있습니다.

참고 자료: 타입 가드와 인터섹션 타입 - TypeScript Handbook

이상으로, 타입 가드와 인터섹션 타입을 활용한 복합 조건 처리에 대해 알아보았습니다. 부족한 부분이 있다면 추가 학습을 통해 보완하시기 바랍니다.