--- id: P-REINFORCE-AUTO-A211EA category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - TypeScript Advanced Type System" --- # [[TypeScript Advanced Type System]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > TypeScript의 κ³ κΈ‰ νƒ€μž… μ‹œμŠ€ν…œμ€ ꡬ쑰적 타이핑(Structural Typing)을 기반으둜 ν•˜λ©΄μ„œλ„, κ°œλ°œμžκ°€ μ½”λ“œμ˜ 예츑 κ°€λŠ₯μ„±κ³Ό μ•ˆμ •μ„±μ„ κ·ΉλŒ€ν™”ν•  수 μžˆλ„λ‘ λ•λŠ” κ°•λ ₯ν•œ 도ꡬ λͺ¨μŒμž…λ‹ˆλ‹€ [1-3]. 이 μ‹œμŠ€ν…œμ€ 집합둠에 κΈ°λ°˜ν•˜μ—¬ νƒ€μž…μ„ κ°’λ“€μ˜ μ§‘ν•©μœΌλ‘œ 닀루며, 컴파일 μ‹œμ μ— λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [3-5]. 식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨, λΈŒλžœλ””λ“œ νƒ€μž…, `readonly` μˆ˜μ‹μ–΄, 그리고 `satisfies` μ—°μ‚°μž λ“±μ˜ κ³ κΈ‰ κΈ°λŠ₯을 톡해 λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ•ˆμ „ν•˜κ²Œ λͺ¨λΈλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [6-10]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **μ§‘ν•©λ‘  기반의 νƒ€μž… 체계 (Set Theory Basis):** TypeScript의 νƒ€μž…μ€ κ°€λŠ₯ν•œ κ°’λ“€μ˜ μ§‘ν•©μœΌλ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€ [3-5]. μœ λ‹ˆμ˜¨(`|`)κ³Ό μΈν„°μ„Ήμ…˜(`&`)은 각각 μ§‘ν•©μ˜ ν•©μ§‘ν•©κ³Ό ꡐ집합을 μ˜λ―Έν•˜λ©°, `extends` ν‚€μ›Œλ“œλŠ” ν•œ νƒ€μž…μ΄ λ‹€λ₯Έ νƒ€μž…μ˜ λΆ€λΆ„μ§‘ν•©(subset)μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€ [5, 11-14]. `never`λŠ” μ–΄λ– ν•œ 값도 κ°€μ§ˆ 수 μ—†λŠ” 곡집합을 λœ»ν•˜κ³ , `unknown`은 λͺ¨λ“  JavaScript 값을 ν¬ν•¨ν•˜λŠ” 전체 μ§‘ν•©(Universe)을 μ˜λ―Έν•©λ‹ˆλ‹€ [5, 14, 15]. - **ꡬ쑰적 타이핑과 κ³Όμž‰ 속성 체크 (Structural Typing & EPC):** 객체의 ν˜•νƒœκ°€ μΌμΉ˜ν•˜λ©΄ ν˜Έν™˜μ„±μ„ μΈμ •ν•˜λŠ” '덕 타이핑(Duck Typing)' 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€ [1-3]. 단, 객체 λ¦¬ν„°λŸ΄μ΄ λ³€μˆ˜μ— 직접 ν• λ‹Ήλ˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 인수둜 전달될 λ•ŒλŠ” 'κ³Όμž‰ 속성 체크(Excess Property Checking)'κ°€ λ°œλ™ν•˜μ—¬ μ„ μ–Έλ˜μ§€ μ•Šμ€ μž‰μ—¬ μ†μ„±μ˜ μœ μž…μ„ μ—„κ²©ν•˜κ²Œ μ°¨λ‹¨ν•©λ‹ˆλ‹€ [3, 16-20]. - **식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨κ³Ό μ™„μ „μ„± 검사 (Discriminated Unions & Exhaustiveness):** 객체가 κ°€μ§ˆ 수 μžˆλŠ” μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ³΅ν†΅λœ λ¦¬ν„°λŸ΄ 속성(νƒœκ·Έ)을 κΈ°μ€€μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ μ’ν˜€λ‚΄λŠ”(Narrowing) νŒ¨ν„΄μž…λ‹ˆλ‹€ [6, 21-23]. `switch` λ¬Έκ³Ό 곡집합인 `never` νƒ€μž…μ„ ν•¨κ»˜ ν™œμš©ν•˜λ©΄, μœ λ‹ˆμ˜¨μ— μƒˆλ‘œμš΄ νƒ€μž…μ΄ 좔가될 λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ λˆ„λ½λœ 처리 λ‘œμ§μ„ μž‘μ•„λ‚΄λŠ” μ™„μ „μ„± 검사(Exhaustiveness Checking)κ°€ κ°€λŠ₯ν•΄μ Έ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό μ›μ²œ μ°¨λ‹¨ν•©λ‹ˆλ‹€ [11, 23-26]. - **λΈŒλžœλ””λ“œ/였패크 νƒ€μž… (Branded/Opaque Types):** ꡬ쑰적으둜 λ™μΌν•œ μ›μ‹œ νƒ€μž…(예: `UserId`용 λ¬Έμžμ—΄κ³Ό `OrderId`용 λ¬Έμžμ—΄)을 κ΅¬λ³„ν•˜κΈ° μœ„ν•΄, λŸ°νƒ€μž„μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ°€μƒμ˜ 속성(예: `__brand`)μ΄λ‚˜ 고유 심볼(unique symbol)을 κ΅μ§‘ν•©μœΌλ‘œ λ¬Άμ–΄ λͺ…λͺ©μ  타이핑(Nominal Typing)을 흉내 λƒ…λ‹ˆλ‹€ [7, 27-31]. 이λ₯Ό 톡해 의미둠적으둜 λ‹€λ₯Έ 데이터가 λ¬΄λΆ„λ³„ν•˜κ²Œ μ„žμ΄λŠ” 것을 컴파일 μˆ˜μ€€μ—μ„œ λ°©μ§€ν•©λ‹ˆλ‹€ [7, 31]. - **λΆˆλ³€μ„± 확립 (`readonly`):** 객체 μ†μ„±μ΄λ‚˜ 배열을 μˆ˜μ • λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€ [8, 32-34]. λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μžˆλŠ” `Object.freeze()`λ‚˜ λ³€μˆ˜ μž¬ν• λ‹Ήλ§Œ λ§‰λŠ” `const`와 달리, 컴파일 νƒ€μž„μ— μ² μ €ν•œ μ œμ–΄λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€ [34-37]. λ§€ν•‘λœ νƒ€μž…κ³Ό 쑰건뢀 νƒ€μž…μ„ κ²°ν•©ν•˜λ©΄ 쀑첩 κ°μ²΄κΉŒμ§€ λ³΄ν˜Έν•˜λŠ” `DeepReadonly` κ΅¬ν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€ [10, 38, 39]. - **`satisfies` μ—°μ‚°μž:** νƒ€μž… 단언(`as`)의 λΆˆμ•ˆμ •μ„±μ„ κ·Ήλ³΅ν•˜κΈ° μœ„ν•œ μ—°μ‚°μžμž…λ‹ˆλ‹€. 객체가 νŠΉμ • νƒ€μž…μ˜ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•˜λŠ”μ§€ κ²€μ‚¬ν•˜λ©΄μ„œλ„, νƒ€μž…μ„ λ„“νžˆμ§€(Widening) μ•Šκ³  ꡬ체적인 λ¦¬ν„°λŸ΄ νƒ€μž… ν˜•νƒœλ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ„λ‘ λ•μŠ΅λ‹ˆλ‹€ [9, 40-43]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Structural Typing]], [[Discriminated Unions]], [[Branded Types]], [[Readonly Modifier]], [[Satisfies Operator]] - **Projects/Contexts:** [[Large-scale Application Architecture]], [[Domain-Driven Design (DDD)]] - **Contradictions/Notes:** μΈν„°νŽ˜μ΄μŠ€(Interface)와 νƒ€μž… 별칭(Type Alias)의 μ‚¬μš© 기쀀에 λŒ€ν•΄ 개발자 κ°„ μ„ ν˜Έλ„ 차이가 μžˆμŠ΅λ‹ˆλ‹€. μΌλΆ€λŠ” 일관성을 μœ„ν•΄ Typeλ§Œμ„ μ„ ν˜Έν•˜κΈ°λ„ ν•˜μ§€λ§Œ [44], TypeScript 곡식 μ„±λŠ₯ κ°€μ΄λ“œμ™€ μ£Όμš” λ¬Έν—Œμ—μ„œλŠ” νƒ€μž… 관계 캐싱 및 μ„ μ–Έ 병합(Declaration Merging)의 μž₯점 λ•Œλ¬Έμ— 객체 ꡬ쑰λ₯Ό ν™•μž₯ν•  λ•ŒλŠ” μΈν„°νŽ˜μ΄μŠ€(`extends`)λ₯Ό μš°μ„ μ μœΌλ‘œ μ‚¬μš©ν•  것을 ꢌμž₯ν•©λ‹ˆλ‹€ [45-49]. λ˜ν•œ, λ³΅μž‘ν•œ νƒ€μž… λΆ„κΈ° 처리λ₯Ό λ•λŠ” μ™ΈλΆ€ 라이브러리(ts-pattern λ“±)의 λ„μž…μ„ 두고 λ‹¨μˆœν•œ μ œμ–΄λ¬Έ(`if`, `switch`) λŒ€λΉ„ μ„±λŠ₯ μ˜€λ²„ν—€λ“œμ™€ 가독성 μΈ‘λ©΄μ—μ„œ 의견 λŒ€λ¦½μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€ [50-52]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/TypeScript Advanced Type System.md]] ---