TypeScript 유형 가드

타입 가드는 개발자가 변수의 타입을 좁히기 위해 런타임 검사를 수행할 수 있게 해주는 TypeScript의 강력한 기능입니다. 이를 통해 더 정확한 타입 정보가 보장되어 더 안전하고 예측 가능한 코드가 만들어집니다. 이 문서에서는 타입 가드가 무엇이고 효과적으로 사용하는 방법을 살펴봅니다.

타입 가드란?

타입 가드는 런타임 검사를 수행하고 TypeScript가 변수에 대해 더 구체적인 유형을 유추할 수 있도록 하는 표현식입니다. 특히 유니언 유형을 다룰 때 다양한 유형을 구별하는 데 도움이 됩니다. 타입 가드는 다음을 포함한 다양한 기술을 사용하여 구현할 수 있습니다.

  • 사용자 정의 유형 술어
  • 유형 어설션
  • 인스턴스 확인
  • typeof 연산자 사용
  • in 연산자 사용

사용자 정의 유형 술어

사용자 정의 유형 술어는 부울 값을 반환하고 검사되는 변수의 유형을 나타내는 특수 반환 유형을 갖는 함수입니다. 이를 만들고 사용하는 방법은 다음과 같습니다.

function isString(value: any): value is string {
  return typeof value === 'string';
}

function printString(value: any) {
  if (isString(value)) {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log('Not a string');
  }
}

위의 예에서 isString은 TypeScript가 valueif 블록 내의 문자열임을 이해하도록 돕는 사용자 정의 유형 술어입니다.

유형 어설션

유형 어설션은 TypeScript에 변수를 특정 유형으로 취급하라고 지시합니다. 이 메서드는 런타임 검사를 수행하지 않지만 TypeScript 컴파일러에 유형에 대해 알립니다. 예를 들어:

function printLength(value: any) {
  console.log((value as string).length); // Assert value is a string
}

이 예에서 value as string은 TypeScript에 런타임 검사를 수행하지 않고 value이 문자열이라고 가정하도록 지시합니다.

인스턴스 확인

인스턴스 검사는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다. 이는 클래스로 작업할 때 유형을 좁히는 데 유용합니다.

class Dog {
  bark() { console.log('Woof'); }
}

class Cat {
  meow() { console.log('Meow'); }
}

function speak(animal: Dog | Cat) {
  if (animal instanceof Dog) {
    animal.bark(); // TypeScript knows animal is a Dog here
  } else {
    animal.meow(); // TypeScript knows animal is a Cat here
  }
}

이 예에서 instanceof 연산자는 TypeScript가 animal의 클래스를 기반으로 해당 유형을 유추하는 데 도움이 됩니다.

typeof 연산자 사용

typeof 연산자는 string, number, boolean과 같은 기본 유형을 확인하는 데 사용할 수 있습니다.

function processValue(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log(value.toFixed(2)); // TypeScript knows value is a number here
  }
}

여기서 typeofvaluestring인지 number인지 확인하고 그에 따라 유형을 축소하는 데 사용됩니다.

in 연산자 사용

in 연산자는 객체에 속성이 있는지 확인합니다. 이는 공통 속성을 공유하는 유형을 구별하는 데 유용합니다.

interface Bird {
  fly: () => void;
}

interface Fish {
  swim: () => void;
}

function move(creature: Bird | Fish) {
  if ('fly' in creature) {
    creature.fly(); // TypeScript knows creature is a Bird here
  } else {
    creature.swim(); // TypeScript knows creature is a Fish here
  }
}

이 예에서 in 연산자는 TypeScript가 메서드의 존재 여부에 따라 creatureBird인지 Fish인지 판별하는 데 도움이 됩니다.

결론

TypeScript 유형 가드는 유연하고 안전한 방식으로 유형을 다루는 데 필수적인 도구입니다. 이를 통해 보다 정확한 유형 검사가 가능하며, 다양한 시나리오에서 올바른 유형이 사용되도록 보장하여 런타임 오류를 방지할 수 있습니다. 유형 가드를 효과적으로 이해하고 사용하면 보다 견고하고 유지 관리하기 쉬운 TypeScript 코드를 얻을 수 있습니다.