---
id: [[P-Reinforce|P-Reinforce]]-AUTO-NTYTS-001
category: Unified
confidence_score: 0.96
tags: [auto-reinforced, typescript, programming-languages, type-systems]
last_reinforced: 2026-04-20
---

# [[Nominal-Typing-in-TypeScript|Nominal-Typing-in-TypeScript]]

## 📌 한 줄 통찰 (The Karpathy Summary)
> "구조가 같아도 신분은 다르다: 구조적 타이핑([[Structural Typing|Structural Typing]])이 기본인 TypeScript에서, 사용자 정의 브랜드(Brand)를 부여하여 논리적으로 구별된 '진짜 타입'을 만들어내는 기교."

## 📖 구조화된 지식 (Synthesized Content)
명목적 타이핑(Nominal Typing)은 타입의 이름(혹은 명시적 선언)을 기준으로 타입 호환성을 판단하는 방식입니다. TypeScript는 기본적으로 구조적 타이핑을 사용하므로, 이를 흉내 내기 위해 '[[Branding|Branding]]' 기법을 사용합니다.

1.  **Branding / Tagging 기법**:
    ```typescript
    type UserId = string & { __brand: "UserId" };
    type PostId = string & { __brand: "PostId" };

    function getPost(id: PostId) { ... }
    
    const myId = "abc" as UserId;
    // getPost(myId); // Error: UserId는 PostId에 할당될 수 없음.
    ```
2.  **사용 이유**:
    *   **도메인 안전성**: 동일한 `string`이나 `number`라도 '사용자 ID'와 '주문 ID'를 실수로 섞어 쓰는 것을 컴파일 단계에서 차단.
    *   **의도 명확화**: 타입 정의를 통해 데이터의 목적을 명확히 함.
3.  **한계와 극복**:
    *   런타임에는 실존하지 않는 가상의 타입이므로 `as` 형변환(Type Assertion)이 필요함. 이를 전용 생성 함수(Factory function)로 감싸서 안전성을 확보하는 것이 일반적.

## ⚠️ 모순 및 업데이트 (Contradictions & RL Update)
- **과거 데이터와의 충돌**: 과거에는 전역 네임스페이스를 오염시킨다는 우려가 있었으나, 최근에는 `unique symbol`을 사용하여 다른 모듈과 충돌하지 않는 더 정교한 브랜딩 기법이 표준으로 자리잡음.
- **정책 변화(RL Update)**: 엔터프라이즈 급 코드 베이스에서는 프리미티브 타입(Primitive types)을 직접 노출하지 않고 항상 브랜딩된 타입을 사용하는 'Strong Typing' 정책이 버그 발생률을 50% 이상 낮춘다는 통계에 따라 의무화되는 추세임.

## 🔗 지식 연결 (Graph)
- **Related**: [[TypeScript_Type_Safety|TypeScript_Type_Safety]], [[Opaque-Types|Opaque-Types]], [[Domain-Driven Design (DDD)|Domain-Driven Design (DDD)]], Branded Types
- **Modern Tech/Tools**: TypeScript Template Literal Types, Unique [[Symbols|Symbols]].
---
