객체는 자바스크립트의 핵심으로 타입스크립트는 객체를 안전하게 표현하고
조작할 수 있는 다양한 수단을 제공한다
API 통신 등을 할 때 깊이를 갖는 중첩된 객체에 대한 응답 타입을 일일히 작성하기 불편하다
이 때 타입스크립트의 key in 방식을 이용하면 좋다
type APIResponse = {
count: number
friends: {
firstName: string
lastName: string
}[]
}
type Friends = APIResponse['friends']
모든 형태와 배열에 키인 할 수 있다
객체의 모든 키를 문자열 리터럴 타입 유니온으로 얻을 수 있다
type ResponseKeys = keyof APIResponse // 'count' | 'friends'
키인과 keyof 를 혼합해 사용하면 객체에서 주어진 키에 해당하는 값을 반환하는 게터를 안전한 방식으로 구현할 수 있다
function get<O extends object, K extends keyof O> (o: O, k: K): O[K] {
return o[k]
}
매핑하는 용도로 객체를 활용할 수 있다
Record 는 일반 객체의 인덱스 시그니처에 비해 자유롭다
일반 인덱스 시그니처에서 객체 값의 타입은 제한할 수 있지만
키는 반드시 일반 string, number, symbol 이어야 한다
Record 에서는 객체의 키 타입도 string 과 number 의 서브타입으로 제한할 수 있다
// Record
type Keys = 'aa' | 'bb'
type ScoreRecord = Record<Keys, number>;
let scores: ScoreRecord = { 'aa': 1, 'bb': 2 };
// Record 를 mapped type 으로 사용할 수도 있다
type Score = {
[key in Keys]: number;
}
Record 에 비해 더 안전하고 더 강력한 방법
매핑된 타입은 타입스크립트만의 고유한 기능이다
객체의 키와 타입을 매핑하는 수단을 제공한다
내장 Record 타입을 구현할 때 매핑된 타입을 이용한다
type Record<K extends keyof any, T> = {
[P in K]: T
}
객체의 키와 값에 타입을 제공할 뿐 아니라
키인 타입과 조합하면 이름별로 매핑할 수 있는 값 타입을 제한할 수도 있다
내장된 매핑된 타입으로는
Record, Partial, Required 등이 있다
스칼라에서 유래한 기능으로 같은 이름을 공유하는 객체와 클래스를 쌍으로 연결한다
타입스크립트에서 타입과 값은 별도의 네임스페이스를 갖는다