Javascript

[JS] 타입스크립트의 Record 타입

kyoulho 2024. 7. 31. 13:14
import {makeRandomCard} './data'
const card = makeRandomCard()
const uuid = card['uuid'] // 색인 연산자로 객체의 'uuid' 속성값 얻기

자바스크립트는 색인 연산자 []를 사용하여 객체의 속성값을 얻을 수 있다. 이러한 형태의 코드는 속성 이름을 잘못 작성하는 실수를 일으킬 수 있다. 또한 이런 오류는 코드가 실행되기 전에는 알 수 없다.

이 때문에 타입스크립트는 기본으로 객체의 속성값을 색인 연산자로 얻을 수 없게 한다. 대신 Record 타입을 제공한다.

 

Record 타입

type Record<K extends keyof any, T> = {
    [P in K]: T;
}
  • K: 객체의 키 타입을 지정한다. keyof any는 모든 가능한 키 타입을 의미한다. (예: string, number, symbol)
  • T: 각 키에 매핑될 값의 타입을 지정한다.

예제

객체 선언

// 문자열 키와 숫자 값을 갖는 객체
const scores: Record<string, number> = {
  alice: 85,
  bob: 92,
  charlie: 88
};

// 특정 문자열 리터럴 키와 숫자 값을 갖는 객체
type Names = 'alice' | 'bob' | 'charlie';
const scores: Record<Names, number> = {
  alice: 85,
  bob: 92,
  charlie: 88
};

// 중첩된 Record 타입을 사용하여 복잡한 객체 구조를 정의
interface Address {
  city: string;
  postalCode: string;
}

const addresses: Record<string, Address> = {
  home: { city: 'Seoul', postalCode: '12345' },
  office: { city: 'Busan', postalCode: '67890' }
};

상태 관리 예제

// 타입 선언
import type {Action} from "redux";
import {List} from "../commonTypes";
export * from '../commonTypes'

export type State = Record<string, List>

export type AddListAction = Action<'@listEntities/add'> & {
    payload: List
}

export type RemoveListAction = Action<'@listEntities/remove'> & {
    payload: string
}

export type Actions = AddListAction | RemoveListAction
// 리듀서 선언
import type * as T from './types'

const initialState: T.State = {}

export const reducer = (state: T.State = initialState, action: T.Actions) => {
    switch (action.type) {
        case "@listEntities/add":
            return {...state, [action.payload.uuid]: action.payload}
        case "@listEntities/remove": {
            const newState = {...state}
            delete newState[action.payload]
            return newState
        }
    }
    return state
}
728x90

'Javascript' 카테고리의 다른 글

[JS] Turborepo를 활용한 공통 라이브러리 관리  (0) 2024.08.31
[JS] Express 기초  (0) 2024.08.02
[JS] peerDepedencies  (0) 2024.07.30
순수 함수  (3) 2024.07.22
[JS] FileReader 클래스  (0) 2024.07.20