-
Type Guard(타입 가드)카테고리 없음 2023. 6. 5. 15:56
Type Guard란?
타입 가드(Type Guard)는 런타임에서 변수의 타입을 체크하고 해당 변수를 사용할 때 타입을 확실하게
추론할 수 있도록 타입을 좁혀 주어 안정성을 보장해 준다. 조건문을 사용하여 변수의 타입을 검사하고, 타입스크립트 컴파일러에게
해당 타입으로 인식되도록 알려주는 역할을 한다. 주로 유니언 타입을 다룰 때 사용된다.
type CombineType = string | number; function add(a:CombineType , b:CombineType){ a+b }
이렇게 유니언 타입을 이용해 함수를 만들면 에러가 발생한다. a와 b는 union type으로 숫자일 수도 문자일 수도 있기 때문이다.
function add(a:CombineType, b:CombineType){ if(typeof a === "string" || typeof b === "string"){ return a.toString() + b.toString(); } return a+b }
그래서 if문을 사용하여 타입을 보장받도록 해주는것이 타입가드이다.
if문 안에는 JavaScript에서 이미 사용되는 typeof , instanceof 나 in을 사용하여 Type Guard를 한다.
typeof를 제외한 다른 방법을 확인해보자.
1️⃣ in
type Admin = { name:string; privileges:string[]; } type Employee ={ name:string; startDate:Date; } type UnknownHuman = Employee | Admin; function printInformation(emp:UnkonwnEmployee){ console.log("name : " + emp.name); console.log("privileges : " + emp.privileges); }
name은 공통으로 갖고 있는 속성이기 때문에 문제가 없지만 privileges는 Admin만 갖는 속성이기 때문에 에러가 표시된다.
여기서 typeof로 타입을 확인해보면 object로 나오고 자세한 속성은 알 수 없다.emp안의 속성 privileges가 있는지를 확인해야하는데,
typeof는 단순히 타입을 알려주는 명령이기 때문에 원하는 결과를 얻을 수 없다.
이럴때 사용할 수 있는 방법은 in을 사용하는 것이다.
function printInformation(emp:UnkonwnEmployee){ console.log("name : " + emp.name); if("privilegs" in emp){ console.log("privileges : " + emp.privileges); } }
이렇게 in을 사용하여 내부의 특정 프로퍼티를 확인할 수 있다.
2️⃣instanceof
클래스를 통해 만들어진 인스턴스 여부를 확인할 때 사용할 수 있다.
class Car{ drive(){ console.log("자동차를 운전합니다."); } } class Truck{ drive(){ console.log("트럭을 운전합니다.") } loadCargo(amount:number){ console.log(`화물을 ${amount}만큼 싣는중`); } } type Vehicle = Car | Truck; const v1 = new Car(); const v2 = new Truck(); functio useVihicle(vehicle:Vehicle){ vehicle.drive(); //둘 다 갖고있는 속성이므로 문제 없음. if(vehicle instanceof Truck){ vehicle.loadCargo(10); } } useVihicle(v2);
이 방법은 클래스의 타입을 직접 확인할 때 사용될 수 있다.