let obj = { name : 'kim', age : 30 }
Object.keys(obj) // [ 'name' , 'age' ]
위와 같이 object의 key값들을 가져오는 연산자가 있다.
keyof 연산자를 이용하면 union 타입을 만들어줌
interface Person {
age : number
name : string
}
keyof Person // 'age' | ' name' 이렇게 남는다.
type PersonKeys = keyof Person // 유니온타입임
/*
PersonKeys = 'age' | 'name'
*/
let a : PersonKeys = 'name' // 가능
type Car = {
color : boolean,
model : boolean,
price : boolean | number
}
// type 잘못 입력해서 string으로 만들고 싶은데...
type Car2 = {
color : string,
model : string,
price : string
} // 이렇게 만들면 되겠지만....
다른 방법을 이용해보자
type Car = {
color : boolean,
model : boolean,
price : boolean | number
}
type TypeChanger<T> = {
// T의 속성이 `key`에 있으면 string으로type지정해주세요 - 근데 당연한것 아닌가?
[key in keyof T ] : string
}
type NewType = TypeChanger<Car>
위와 같이 타입을 매핑 ( A -> B로 변환) 해버리면 된다 .
근데 ,
사실 쓰는 법이 정해져있다고 한다 .
[작명 in keyof 타입파라미터 ] : 원하는 타입
이렇게 입력하면 object 타입을 입력했을 때 속성명은 그대로지만 다른 타입으로 변환해주는 변환기를 만들 수있다.
위의 mapping이 와닿지가 않으면 하드코딩해보면 되지..
객체의 속성들을 순회해서 속성의 타입을 다른 타입으로 바꿔주는 역할을 한다. 라는 의미인데
객체의 속성 (key) 값을 맵핑할 때 쓰는 공식? 규칙?이 바로
[key in keyof 타입파라미터 ]
을 이용하는 것이다. 라고 일단은 생각하자.
일단은 생각하자고만 마치는 이유는 아직 공부하는 중이고 다양한 시도를 안해보았기 때문!