Enum을 넘어서 - const assertions의 장점과 Tree-shaking

2025. 2. 12. 10:16·TypeScript
반응형

Enum의 기본 개념과 한계

TypeScript에서 Enum은 관련된 상수들을 그룹화하는 방법을 제공합니다.

// 기본적인 Enum 사용
enum UserRole {
    ADMIN = 'ADMIN',
    USER = 'USER',
    GUEST = 'GUEST'
}

// 사용 예시
function checkAccess(role: UserRole) {
    if (role === UserRole.ADMIN) {
        return true;
    }
    return false;
}

하지만 Enum은 몇 가지 중요한 한계가 있습니다:

  1. Tree-shaking이 불가능
  2. 컴파일 후 추가적인 런타임 코드 생성
  3. 번들 크기 증가

Tree-shaking이란?

Tree-shaking은 사용하지 않는 코드를 제거하는 최적화 과정입니다.

// Tree-shaking 전
const utils = {
    add: (a: number, b: number) => a + b,
    subtract: (a: number, b: number) => a - b,
    multiply: (a: number, b: number) => a * b
}

// 실제 사용
utils.add(1, 2)

// Tree-shaking 후 번들에는 add 함수만 포함됨

as const를 사용한 더 나은 해결책

// Enum 대신 const assertion 사용
const UserRole = {
    ADMIN: 'ADMIN',
    USER: 'USER',
    GUEST: 'GUEST'
} as const;

// 타입 추출
type UserRoleType = typeof UserRole[keyof typeof UserRole];

// 사용 예시
function checkAccess(role: UserRoleType) {
    if (role === UserRole.ADMIN) {
        return true;
    }
    return false;
}

as const의 장점

더 나은 Tree-shaking

// 일부만 사용해도 필요한 부분만 번들에 포함
import { ADMIN } from './roles';

 

타입 안전성

const Colors = {
    RED: '#ff0000',
    GREEN: '#00ff00',
    BLUE: '#0000ff'
} as const;

type Color = typeof Colors[keyof typeof Colors];

// 컴파일 타임에 타입 체크
function setColor(color: Color) {
    // color는 정확히 '#ff0000' | '#00ff00' | '#0000ff' 타입
}

 

유연한 확장

const BaseColors = {
    RED: '#ff0000',
    GREEN: '#00ff00',
    BLUE: '#0000ff'
} as const;

const ExtendedColors = {
    ...BaseColors,
    YELLOW: '#ffff00',
    PURPLE: '#ff00ff'
} as const;

실제 활용 예시

// API 엔드포인트 정의
const API_ENDPOINTS = {
    USER: {
        GET: '/api/users',
        POST: '/api/users',
        PUT: '/api/users/:id',
        DELETE: '/api/users/:id'
    },
    POSTS: {
        GET: '/api/posts',
        POST: '/api/posts'
    }
} as const;

type ApiEndpoint = typeof API_ENDPOINTS;
type UserEndpoints = ApiEndpoint['USER'];

// 타입 안전한 API 호출
async function fetchUser(id: string) {
    const url = API_ENDPOINTS.USER.GET.replace(':id', id);
    return fetch(url);
}

고급 패턴

유니온 타입 생성

const HttpStatus = {
    OK: 200,
    CREATED: 201,
    BAD_REQUEST: 400,
    UNAUTHORIZED: 401,
    NOT_FOUND: 404
} as const;

type StatusCode = typeof HttpStatus[keyof typeof HttpStatus];
// type StatusCode = 200 | 201 | 400 | 401 | 404

 

객체 키 타입 추출

const CONFIG = {
    apiUrl: 'https://api.example.com',
    timeout: 5000,
    retryCount: 3
} as const;

type ConfigKey = keyof typeof CONFIG;
// type ConfigKey = 'apiUrl' | 'timeout' | 'retryCount'

 

값 타입 매핑

const PERMISSIONS = {
    READ: 'read',
    WRITE: 'write',
    ADMIN: 'admin'
} as const;

type PermissionMap = {
    [K in keyof typeof PERMISSIONS]: boolean;
};

// 사용 예시
const userPermissions: PermissionMap = {
    READ: true,
    WRITE: false,
    ADMIN: false
};

 

이러한 접근 방식은 다음과 같은 이점을 제공합니다:

  1. 더 작은 번들 크기
  2. 더 나은 타입 추론
  3. 런타임 오버헤드 감소
  4. 더 유연한 코드 구조

Tree-shaking과 타입 안전성을 모두 고려할 때, as const는 TypeScript에서 상수를 다루는 더 현대적이고 효율적인 방법을 제공합니다. 특히 큰 규모의 애플리케이션에서 번들 크기 최적화가 중요한 경우에 매우 유용합니다.

저작자표시 비영리 변경금지 (새창열림)

'TypeScript' 카테고리의 다른 글

React useEffect 의존성 경고  (1) 2025.02.14
Nginx 413 Request Entity Too Large 오류 해결  (0) 2025.02.13
[REST API] RESTful API 설계 가이드  (1) 2025.01.29
[HTTP Header 다루기] fetch API의 Headers 인터페이스  (0) 2025.01.26
[JavaScript] 문자열 검색과 비교  (1) 2025.01.25
'TypeScript' 카테고리의 다른 글
  • React useEffect 의존성 경고
  • Nginx 413 Request Entity Too Large 오류 해결
  • [REST API] RESTful API 설계 가이드
  • [HTTP Header 다루기] fetch API의 Headers 인터페이스
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (724) N
      • 상품 추천 (223) N
      • MongoDB (4)
      • 하드웨어 (16) N
      • 일기장 (4)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • 파이썬 (13)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (41)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    유니티
    리뷰이관
    파이썬
    C#
    rtsp
    믈레코비타멸균우유
    learntocode
    스크립트 실행
    스크립트 실행 순서
    unity
    devlife
    긴유통기한우유
    리뷰관리
    codingcommunity
    programmerlife
    codingtips
    카페24리뷰이관
    라떼우유
    리스트
    programming101
    상품 리뷰 크롤링
    Python
    카페24리뷰
    스마트스토어리뷰
    셀레니움
    list
    cv2
    ipcamera
    쇼핑몰리뷰
    appdevelopment
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
Enum을 넘어서 - const assertions의 장점과 Tree-shaking
상단으로

티스토리툴바