-
Object타입 변환기 만들기, 조건문이용과 inferTypescript 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