TypeScript

TIL | Type guard

Type guard

Type guard??

  • 특정 범위 안에서 타입을 좁혀가며 런타임 타입 검사를 수행하는 표현식이다. - typescript docs
  • 타입 가드를 사용함으로써, 무분별한 타입 단언(Type Assertion)을 막을 수 있다.

 

Example

원시 타입을 검사할때

type Combinable = number | string;

const add = (a: Combinable) => {
  if (typeof a === "string") {
    // Type Guard
    return a.split("");
  }
  return a;
};

console.log(add(1));
  • 원시 타입은 typeof 키워드를 사용하여 타입을 검사할 수 있다. 위 예시에서 typeof 키워드 없이 a.split("")을 적용하게 되면 에러가 발생하게 되는데, anumber일수도 있기 때문이다. (split()string 타입만 사용할 수 있다.) 따라서 타입 가드를 사용함으로써 불분명한 인자의 타입을 검사하며 런타임 환경에서의 에러를 방지할 수 있다.

 

일반 객체 타입을 검사할 때

type Admin = {
  name: string;
  age: number;
};

type Employee = {
  name: string;
  gender: string;
};

type UnknownEmployee = Employee | Admin;

const person1 = {
  name: "Tomas",
  age: 30,
};

를 사용할 시
const printEmployeeInformation = (employee: UnknownEmployee) => {
  // (parameter) employee: UnknownEmployee
  console.log(`Name: ${employee.name}`);
  if ("age" in employee) {
    // (parameter) employee: Admin
    // employee에 age라는 property값이 존재하면 Admin 타입
    console.log(`Age: ${employee.age}`);
  }
  if ("gender" in employee) {
    // (parameter) employee: Employee
    // employee에 gender라는 property값이 존재하면 Employee 타입
    console.log(`gender: ${employee.gender}`);
  }
};

printEmployeeInformation(person1);
  • 일반 객체에 타입 가드를 사용하고자 할 경우, JSin 키워드를 사용하여 체크할 수 있다.

 

Class 에서의 사용

class Car {
  drive = () => {
    console.log("Driving");
  };
  isTuning = () => {
    console.log("is Tuning");
  };
}

class Truck {
  drive = () => {
    console.log("Driving a truck");
  };
  loadCargo = (amount: number = 1) => {
    console.log(`Loading cargo ... ${amount}`);
  };
}

type Vehicle = Car | Truck;

const v1 = new Car();
const v2 = new Truck();

const useVehicle = (vehicle: Vehicle) => {
  vehicle.drive();
  if (vehicle instanceof Car) {
    vehicle.isTuning();
  }
  if (vehicle instanceof Truck) {
    vehicle.loadCargo();
  }
};
  • 클래스를 통해 생성된 인스턴스에서 사용하고자 할 경우, instanceof를 통해 체크할 수 있다.

 

Reference

'TypeScript' 카테고리의 다른 글

TIL | Custom hook with return tuple type array  (0) 2022.12.16
TIL | Index signature  (0) 2021.10.24
TIL | Interface VS Type  (0) 2021.10.24
TIL | Generics  (0) 2021.10.23
TIL | Interface  (0) 2021.10.23