타입스크립트 공부 중 Record Type이라는 타입을 알게 되어서 정리를 해보려고 한다.
Record <Key, Value>
키가 Key 타입이고 값이 Value인 객체 타입
- Key: 객체의 키로 사용할 수 있는 문자열, 숫자, 심볼 등의 타입
일반적으로 문자열 리터럴 타입이나 유니언 타입을 사용합니다. - Type: 해당 키에 매핑될 값의 타입을 정의합니다.
Idex Signature(인덱스 시그니쳐)
Record타입에 사용 방법은 IdexSignature 방법과 유사한데
Idex Signature는 객체의 키와 값의 타입을 정의하는 데 되며
객체의 모든 키가 동일한 타입을 가지며,
그에 대응하는 값도 특정 타입을 가져야 할 때 사용
typ Scores {
[key: string]: number;
}
const scores: Scores = {
alice: 90,
bob: 85,
charlie: 72,
};
Index Signature 문제는
key값에 문자열 리터럴을 사용하지 못한다!!
// An index signature parameter type cannot be a literal type or generic type.
// Consider using a mapped object type instead
type Score = {
[name: '사과' | '바나나']: number;
}
Record 타입은?
- 문자열 리터럴 또는 유니언 타입 사용가능
- 키의 집합이 고정
- 키는 특정 값들로 제한되며, 해당 값들만 객체의 키로 사용
- 모든 키가 같은 타입
type User = 'alice' | 'bob' | 'charlie';
const scores: Record<User, number> = {
alice: 90,
bob: 85,
charlie: 72,
};
Index Signature | Record Type | |
키의 타입 | 주로 string, number, symbol | 특정 리터럴 타입 또는 유니언 타입 |
키의 집합 | 모든 키가 허용된 타입을 따름 (키에 대한 제한이 거의 없음) |
특정 키 집합으로 제한됨 |
사용 시점 | 모든 키가 동일한 타입일 때 제한 없는 키를사용할 때 |
특정 키 집합이 존재하고, 키들에 대해 명확한 타입 제약이 필요할 때 |
정의 방법 | 인터페이스 또는 타입 에일리어스로 정의 |
Record<Keys, Type> 유틸리티 타입으로 정의 |
타입 체크 강도 | 키에 대한 타입 제약이 상대적으로 약함 | 키 집합이 고정되어 있어 엄격한 타입 체크 가능 |
Idex Signature 적합한 경우는?
객체의 키가 동적으로 결정되고,
특정 키에 제한을 두지 않으면서 값 타입을 정의할 때
Record Type 적합한 경우:
객체의 키가 고정되어 있으며, 특정 키 집합에 대해 값 타입을 정의할 때
Record Type 사용 해보기
사용자가 입력한 패스워드를 볼 수 있게 끔 클릭할 수 있는
눈 모양의 아이콘에 상태관리 도구 zustand를 활용하여 사용해 보았다.
결과