[typescript] 타입 가드의 종류

타입 가드(Type Guards)는 TypeScript에서 특정 타입인지를 체크하고, 그 타입에 따라 다른 동작을 수행할 수 있도록 하는 도구입니다. 타입 가드는 다양한 방식으로 구현될 수 있으며, 다양한 상황에 맞게 사용할 수 있습니다.

이 글에서는 TypeScript에서의 다양한 타입 가드의 종류에 대해 알아보겠습니다.

1. 타입 체킹 함수

타입 체킹 함수는 주어진 값이 특정 타입에 속하는지를 확인하고, 해당 타입으로 형변환할 수 있도록 하는 함수입니다.

예를 들어, 다음과 같이 isNumber라는 타입 체킹 함수를 만들어 사용할 수 있습니다.

function isNumber(value: any): value is number {
  return typeof value === 'number';
}

let someValue: any = 5;

if (isNumber(someValue)) {
  console.log('The value is a number.');
} else {
  console.log('The value is not a number.');
}

2. instanceof 키워드

instanceof 키워드는 객체가 해당 클래스나 생성자 함수로부터 생성되었는지를 확인할 때 사용됩니다. 이를 활용하여 해당 객체의 타입을 확인할 수 있습니다.

예를 들어, 다음과 같이 Animal 클래스의 인스턴스인지를 확인할 수 있습니다.

class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

class Dog extends Animal {
  breed: string;
  constructor(name: string, breed: string) {
    super(name);
    this.breed = breed;
  }
}

let dog = new Dog('Buddy', 'Golden Retriever');

if (dog instanceof Animal) {
  console.log('The dog is an instance of Animal.');
} else {
  console.log('The dog is not an instance of Animal.');
}

3. 사용자 정의 타입 가드

사용자 정의 타입 가드는 개발자가 직접 정의한 함수를 사용하여 타입을 체크하는 방식입니다. 이를 활용하여 자신만의 타입 가드를 정의하고 사용할 수 있습니다.

예를 들어, 다음과 같이 사용자 정의 타입 가드를 만들고 사용할 수 있습니다.

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

interface Square {
  kind: 'square';
  sideLength: number;
}

type Shape = Circle | Square;

function isCircle(shape: Circle | Square): shape is Circle {
  return (shape as Circle).kind === 'circle';
}

function getArea(shape: Shape) {
  if (isCircle(shape)) {
    return Math.PI * shape.radius ** 2;
  } else {
    return shape.sideLength ** 2;
  }
}

결론

타입 가드를 활용하면 TypeScript에서 좀 더 안전하고 예측 가능한 코드를 작성할 수 있습니다. 다양한 타입 가드를 적절히 활용하여 코드의 가독성과 안정성을 높일 수 있습니다.

본문은 TypeScript 버전 4.4 기준으로 작성되었습니다.

참고 자료