타입스크립트 타입 가드로 안전한 코드 작성하기

0

타입스크립트(TypeScript)는 자바스크립트의 상위 집합으로, 정적 타입 검사 기능을 제공합니다. 이 기능 덕분에 코드의 안정성과 가독성을 높일 수 있습니다. 그 중에서도 타입 가드는 변수의 타입을 확인하고 좁히는 중요한 역할을 합니다. 이번 글에서는 타입스크립트의 타입 가드에 대해 자세히 살펴보겠습니다.

타입 가드란 무엇인가?

타입 가드는 코드 내에서 특정 타입인지 확인하는 논리를 추가하여 타입스크립트 컴파일러가 변수의 타입을 좁히는 데 사용됩니다. 이를 통해 타입스크립트는 조건문 내에서 변수의 타입을 더 정확하게 추론할 수 있습니다. 타입 가드를 사용하면 런타임 오류를 줄이고 타입 안전성을 높일 수 있습니다.

타입 가드의 종류

타입스크립트에서는 주로 세 가지 타입 가드를 사용합니다:

  • `typeof` 타입 가드
  • `instanceof` 타입 가드
  • 사용자 정의 타입 가드 (커스텀 타입 가드)

1. `typeof` 타입 가드

`typeof` 연산자는 기본 타입(primitive types)을 확인하는 데 사용됩니다. 예를 들어, 문자열인지 숫자인지 확인할 때 유용합니다.

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

function example(value: string | number) {
  if (isString(value)) {
    // 여기서 TypeScript는 value가 string 타입임을 알게 됩니다.
    console.log(value.toUpperCase());
  } else {
    // 여기서 TypeScript는 value가 number 타입임을 알게 됩니다.
    console.log(value.toFixed(2));
  }
}

위 예제에서 `isString` 함수는 `value`가 문자열인지 확인하고, 조건문 내에서 타입스크립트가 `value`를 `string`으로 인식하게 합니다.

2. `instanceof` 타입 가드

`instanceof` 연산자는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다.

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

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

function example(pet: Dog | Cat) {
  if (pet instanceof Dog) {
    // 여기서 TypeScript는 pet이 Dog 타입임을 알게 됩니다.
    pet.bark();
  } else {
    // 여기서 TypeScript는 pet이 Cat 타입임을 알게 됩니다.
    pet.meow();
  }
}

이 예제에서는 `pet`이 `Dog` 클래스의 인스턴스인지 확인하고, 조건에 따라 타입을 좁힙니다.

3. 사용자 정의 타입 가드

사용자 정의 타입 가드는 함수의 반환 타입에 `value is Type` 구문을 사용하여 특정 조건을 만족할 때 타입을 좁히는 방식입니다. 이를 통해 복잡한 객체 구조나 제네릭 타입도 안전하게 다룰 수 있습니다.

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

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

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

function example(pet: Fish | Bird) {
  if (isFish(pet)) {
    // 여기서 TypeScript는 pet이 Fish 타입임을 알게 됩니다.
    pet.swim();
  } else {
    // 여기서 TypeScript는 pet이 Bird 타입임을 알게 됩니다.
    pet.fly();
  }
}

이 예제에서 `isFish` 함수는 `pet`이 `Fish` 타입인지 확인하고, 조건문 내에서 타입을 좁히는 역할을 합니다.

타입 가드의 활용 예시

타입 가드는 다양한 상황에서 활용될 수 있습니다. 복잡한 객체 구조나 제네릭 타입을 다루는 경우에도 유용합니다.

interface Admin {
  role: 'admin';
  privileges: string[];
}

interface User {
  role: 'user';
  email: string;
}

function isAdmin(account: Admin | User): account is Admin {
  return account.role === 'admin';
}

function logAccountInfo(account: Admin | User) {
  if (isAdmin(account)) {
    // 여기서 TypeScript는 account가 Admin 타입임을 알게 됩니다.
    console.log(`Admin with privileges: ${account.privileges}`);
  } else {
    // 여기서 TypeScript는 account가 User 타입임을 알게 됩니다.
    console.log(`User with email: ${account.email}`);
  }
}

이 예제에서는 `isAdmin` 함수가 `account`가 `Admin` 타입인지 확인하고, 조건문 내에서 타입을 좁히는 역할을 합니다.

결론

타입스크립트의 타입 가드는 코드의 타입 안전성을 높이고, 런타임 오류를 줄이는 데 중요한 역할을 합니다. `typeof`, `instanceof`, 사용자 정의 타입 가드를 통해 다양한 상황에서 타입을 안전하게 다룰 수 있습니다. 타입스크립트를 사용하여 타입 안전성을 강화하고, 더 신뢰성 있는 코드를 작성해 보세요.

Leave a Reply