ABOUT ME

Today
Yesterday
Total
  • 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 , instanceofin을 사용하여 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);

     

    이 방법은 클래스의 타입을 직접 확인할 때 사용될 수 있다.

     

     

     

     

Designed by Tistory.