ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Object타입 변환기 만들기, 조건문이용과 infer
    Typescript 2022. 6. 18. 08:21

    먼저, keyof 연산자를 알아보자.

    let obj = {name : 'Kim'}
    Object.keys(obj) //키 값 가져옴

    원래는 이렇게 쓰는데 key값을 가져오는데 keyof를 사용할 수 있다.

    interface Person {
      age: number;
      name: string;
    }
    type PersonKeys = keyof Person;   //"age" | "name" 타입됩니다
    let a :PersonKeys = 'age'; //가능
    let b :PersonKeys = 'ageeee'; //불가능

    이렇게 interface에 사용하면 key인 age | name이 남게된다.

     

    이제, 타입변환기 (mapping)를 보면,

    type Car = {
      color: boolean,
      model : boolean,
      price : boolean | number,
    };
    
    type TypeChanger <MyType> = {
      [key in keyof MyType]: string;
    };
    
    type 새로운타입 = TypeChanger<Car>;
    
    let obj :새로운타입 = {
      color: 'red',
      model : 'kia',
      price : '300',
    }

    이렇게 Car라는 타입을 잘못만들어서 다 바꿔야 할 때, TypeChanger라는 타입에 Generic을 정해주고,

    key in keyof MyType라고 적어서 [color | model | price]가 string타입으로 바뀌게 한다. 그리고 그걸 새변수에 담아 사용해주면 된다.

     

    이제 조건문으로 타입을 만들어보자.

    파라미터로 string을 집어넣으면 string을 남겨주시고, 그게 아니면 unknown을 남겨주세요 라고 짜보자.

    type Age<T> = T extends string ? string : unknown;
    let age : Age<string> //age는 string 타입
    let age2 : Age<number> //age는 unknown 타입

    삼항연산자를 사용하는데 T라는 타입이 string인지 검사해야하니까 extends키워드를 사용해서

    T가 string이면 string남기고, 아니면 unknown남겨주세요라고 짤 수 있다.

     

    이제 infer키워드를 보면,

    infer은 타입을 왼쪽에서 추출해준다. 예를 들면,

    type Person<T> = T extends infer R ? R : unknown; 
    type 새타입 = Person<string> // 새타입은 string 타입입니다

    T에 string라고 쓰면 왼쪽에서 타입 뽑아서 R변수에 담아주세요니까 R이란 변수도 string이 된다.

     

    실용성있는 예시를 보자.

    type 타입추출<T> = T extends (infer R)[] ? R : unknown; 
    type NewType = 타입추출< boolean[] > // NewType 은 boolean 타입입니다

    여기서 T는 boolean[] 이므로 (infer R) [] 에서 R은 boolean이 된다. 이러면 boolean어레이 타입을 입력하면 boolean이 남는 array내부의 타입만 뽑게 된다.

     

    또 예시를 보면

    type 타입추출<T> = T extends ( ()=> infer R ) ? R : unknown; 
    type NewType = 타입추출< () => number > // NewType은 number 타입입니다

    여기서 T는 () => number이 되고, () => infer R에서 R은 number이 되면서 

    함수를 넣으면 함수의 return타입만 뽑게 된다.

     

    사실

    type b = ReturnType< () => void >

    이렇게 쓰면 return타입을 자동으로 뽑아준다.

    'Typescript' 카테고리의 다른 글

    object의 index signatures  (0) 2022.06.18
    implements키워드  (0) 2022.06.18
    d.ts파일 이용하기  (0) 2022.06.18
    외부파일 이용시 declare & ambient module  (0) 2022.06.17
    array에 붙이는 tuple type  (0) 2022.06.17

    댓글

Designed by Tistory.