기본 패턴
ts
const roles = {
admin: { canDelete: true },
user: { canDelete: false },
};
type Roles = typeof roles;
type RoleName = keyof Roles;
type AdminConfig = Roles["admin"];설명
- TypeScript를 잘 쓰기 시작하는 지점은 타입을 새로 다 적는 순간이 아니라, 이미 있는 값과 타입에서 필요한 정보를 뽑아 재사용하기 시작하는 순간입니다.
typeof는 값에서 타입을 가져옵니다. 변수, 객체 리터럴, 함수 같은 실제 값을 기준으로 타입을 얻고 싶을 때 가장 먼저 등장합니다.- indexed access는
User["name"]처럼 기존 타입의 일부를 꺼내는 도구입니다. "이 속성의 타입만 재사용하고 싶다"는 요구에 딱 맞습니다. keyof는 타입의 키 집합을 union으로 만듭니다. 그래서typeof + keyof + indexed access를 조합하면 "값 하나를 진실의 원천으로 두고, 거기서 타입을 유도하는" 패턴이 가능해집니다.- 실무에서는 상수 객체, 설정 테이블, API 응답 예시, 이벤트 맵에서 이 패턴이 매우 자주 등장합니다. 타입을 복사해서 새로 쓰는 대신, 값에서 타입을 끌어오면 중복과 불일치를 크게 줄일 수 있습니다.
빠른 정리
| 도구 | 역할 |
|---|---|
typeof value | 값에서 타입 추출 |
keyof Type | 키 이름 union 추출 |
Type["key"] | 특정 속성 타입 추출 |
Type[keyof Type] | 모든 값 타입의 union |
| 장점 | 중복 정의를 줄이고 진실의 원천을 한곳에 둠 |
주의할 점
값에서 타입을 만들 때는 리터럴이 너무 빨리 넓어지지 않는지도 함께 봐야 합니다. 필요하면
as const나 satisfies와 조합해야 의도한 정밀도가 유지됩니다.
참고 링크
3 sources