Record 유틸리티 타입은 특정 키와 그에 상응하는 타입을 매핑하여 새로운 타입을 생성하는 도구입니다.
특정 키가 있고 그 키에 대해 일관된 값 타입을 가지는 객체를 정의할때 유용합니다.
Record 타입은 두 개의 제네릭 매개변수를 받습니다.
Record<Keys,Type>
Keys : 객체의 키를 나타냅니다. 여기에는 문자열 리터럴의 유니언 타입, string, number, symbol 과 같은 키 타입이 올 수 있습니다.
Type : 해당 키에 할당될 값의 타입을 나타냅니다.
Record 타입은 인덱스 시그니처와 유사한 기능을 합니다.
하지만 Record 타입을 사용하면 키로 문자열 리터럴을 명확하게 지정할 수 있어 타입 안전성을 높일 수 있습니다.
// 인덱스 시그니처로 정의한 타입
type Price = {
[product : string] : number
}
// Record 로 정의한 타입
type PriceRecord = Record<string, number>
const price : PriceRecord = {
'가방' : 15000,
'지갑' : 12000,
'인형' : 5000
}
Record 타입이 인덱스 시그니처와 다른점이 있다면, 바로 key 로 문자열 리터럴을 사용할 수 있다는 점 입니다.
type Product = '가방' | '지갑' | '인형'
type Price = {
[product : Product] : number
}
이렇게 작성하니 빨간줄이 그어지는데, 인덱스 시그니처 매개 변수 형식은 리터럴 유형이나 제네릭 형식일 수 없기 때문입니다.
이럴때 Record 를 사용하거나 아니면 맵드 타입을 사용해 해결이 가능합니다.
type Product = '가방' | '지갑' | '인형'
// 유니온 타입으로 생성
type PriceRecord = Record<Product, number>
// 맵드 타입으로 생성
type Price = {
[product in Product] : number
}