Programming Language/JS & TS

[TS] Record 타입 알아보기

monkeykim 2024. 11. 26. 00:30

Record는 TypeScript에서 제공하는 유틸리티 타입으로, 객체의 키와 값의 타입을 명시적으로 지정할 때 사용됩니다. 이를 통해 객체의 구조를 더 명확히 정의할 수 있습니다.


기본 문법

Record<Keys, Type>

 

  • Keys: 객체의 키 타입 (일반적으로 문자열, 숫자, 또는 유니온 타입).
  • Type: 키에 해당하는 값의 타입.

사용 예시

1. 간단한 객체 정의

type User = Record<string, string>;

const users: User = {
  id: '123',
  name: 'Alice',
};

 

 

  • string 키: 객체의 모든 키가 문자열이어야 함.
  • string 값: 모든 값이 문자열이어야 함.

2. 키와 값의 타입을 명시적으로 정의

 

type Settings = Record<'theme' | 'layout', string>;

const appSettings: Settings = {
  theme: 'dark',
  layout: 'grid',
};

 

  • 키는 'theme' 또는 'layout' 중 하나만 가능.
  • 각 키의 값은 string 타입이어야 함.

3. 유니온 타입 키 사용

 

type Data = Record<'success' | 'error', boolean>;

const response: Data = {
  success: true,
  error: false,
};

 

  • 키는 success 또는 error만 가능.
  • 값은 각각 boolean 타입이어야 함.

Record를 사용하는 이유

  1. 명확하고 간결한 표현:
    • 객체 타입을 정의할 때, Record를 사용하면 의도가 더 명확히 드러납니다.
    • 예: Record<string, number>는 "모든 키는 문자열이고, 값은 숫자"라는 의미.
  2. 유연성:
    • Record는 다양한 키 타입과 값 타입을 지원하므로 복잡한 객체 구조를 쉽게 정의할 수 있습니다.
  3. 표준화:
    • Record는 TypeScript에서 제공하는 표준 유틸리티 타입이므로, 커뮤니티에서 널리 사용되며 가독성이 좋습니다.

비교: 인덱스 시그니처와 Record

인덱스 시그니처

type User = { [key: string]: string };

const users: User = {
  id: '123',
  name: 'Alice',
};

 

Record

type User = Record<string, string>;

const users: User = {
  id: '123',
  name: 'Alice',
};
  • 기능적으로 동일하지만, Record는 의도를 명확히 드러내고 코드 가독성을 높입니다.

Record의 한계

  1. 고정된 키:
    • 특정 키가 반드시 존재해야 하는 경우, interface나 다른 방법이 더 적합할 수 있습니다.
    • 예: interface를 사용하면 선택적 속성(?)이나 필수 속성을 혼합하여 정의 가능.
  2. 추가적인 제한이 필요한 경우:
    • Record는 키와 값의 타입만을 정의하므로, 더 복잡한 제약 조건을 추가할 때는 한계가 있습니다.