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("")
을 적용하게 되면 에러가 발생하게 되는데,a
는number
일수도 있기 때문이다. (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);
- 일반 객체에 타입 가드를 사용하고자 할 경우,
JS
의in
키워드를 사용하여 체크할 수 있다.
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 |