ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Typescript - Narrowing
    Front-end/Typesrcipt 2023. 4. 18. 01:46
    728x90
    반응형

    Typescript Narrowing

    Typescript Narrowing 이란 타입 에러를 피하기 위해 조건에 따라 변수를 더 정확한 타입으로 좁히는 방법이다.

    Typescript Narrowing 방법중 && 연산자를 사용하여 null 또는 undefined type 을 체크해 줄 수 있다.

    function narrowFn(a: string | undefined) { // string 타입이 아닌 undefined 타입이 올 경우
        if ( a && typeof a === 'string' ) { // if문으로 narrowing 처리를 하여 string 타입만 허용
            ...
        }
    }

     

    typeof 연산자는 number, string, boolean, object 등 타입을 지정하는것이 제한적이다.

    type키워드로 타입을 narrowing할때는 in 키워드를 사용하여 narrowing 처리를 한다.

    type Cat = { meow: string };	// type 키워드로 선언
    type Dog = { bow: string };
    
    function myPet (pet : Cat | Dog){ 
        if ( 'meow' in pet ) {	// in 키워드를 사용하여 오브젝트 속에 있는 속성명으로 narrowing
            pet.meow;	// meow 가 있는 타입만 허용이 가능하도록 한다.
        }
    }

    in 키워드를 사용하기 위해선 베타적인 속성이 있어야 가능하다.

     

     

     

    반응형

     

     

     

    instanceof 키워드를 사용하여 class를  narrowing 처리를 할 수 있다.

    let date = new Date();	// 클래스를 선언한다.
    if(date instanceof Date) {	// 왼쪽에는 object를 선언하고 오른쪽에는 부모class를 선언한다
        ...
    }

     

    비슷한 속성여러개 있을때는 intanceof 키워드나 in키워드를 사용하여 narrowing 처리를 할 수 가 없다.

    이를 narrowing 처리를 하기위해선 literal type을 넣어서 narrowing처리를 해주어야 한다.

    // wheels, color 같은 두개의 속성을 갖고있다.
    type Car = {
        wheels: '4개',
        color: string
    };
    
    type Bike = {
        wheels: '2개',
        color: string
    };
    
    function vehicle(a: Car | Bike) {
        if(a.wheels === '4개') {	// 속성의 literal type을 사용하여 narrowing처리를 한다.
            console.log("a는 Car 타입이다.");	// '4개' 리터럴 타입을 갖는 Car 타입만 올 수 있다.
        }
    }

     

    728x90
    반응형

    'Front-end > Typesrcipt' 카테고리의 다른 글

    Typescript - public & private  (0) 2023.04.18
    Typescript - never type  (0) 2023.04.18
    Typescript - rest & destructuring  (0) 2023.04.14
    Typescript - Class Type & Interface  (0) 2023.04.14
    Typescript - HTML DOM 제어  (0) 2023.04.13
Designed by Tistory.