--- id: P-REINFORCE-AUTO-5C8A49 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 νƒ€μž… μ‹œμŠ€ν…œ (TypeScript Type System)" --- # [[TypeScript νƒ€μž… μ‹œμŠ€ν…œ (TypeScript Type System)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > TypeScript의 νƒ€μž… μ‹œμŠ€ν…œμ€ ꡬ쑰적 타이핑(Structural Typing)을 기반으둜 ν•˜μ—¬, 객체의 μ‹€μ œ ν˜•νƒœκ°€ μΌμΉ˜ν•˜λ©΄ ν˜Έν™˜μ„±μ„ μΈμ •ν•˜λŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€[1, 2]. λ™μ‹œμ— κ³Όμž‰ 속성 체크(Excess Property Checking)λ‚˜ `satisfies` μ—°μ‚°μžμ™€ 같은 λ°©μ–΄ 기제λ₯Ό 톡해 λŸ°νƒ€μž„ μ—λŸ¬μ™€ μ˜λ„μΉ˜ μ•Šμ€ 데이터 μœ μž…μ„ 컴파일 μ‹œμ μ— μ°¨λ‹¨ν•œλ‹€[3-6]. μ΄λŠ” μ§‘ν•©λ‘ (Set Theory)적 κ΄€μ μ—μ„œ νƒ€μž…μ„ μ •μ˜ν•˜κ³  ν‰κ°€ν•˜λ©°, ꢁ극적으둜 λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ³΄ν˜Έν•˜κ³  κ²¬κ³ ν•œ μΈν„°νŽ˜μ΄μŠ€ 섀계λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ•„ν‚€ν…μ²˜μ  λ„κ΅¬λ‘œ κΈ°λŠ₯ν•œλ‹€[2, 7-9]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **ꡬ쑰적 타이핑과 μ§‘ν•©λ‘  (Structural Typing & Set Theory):** TypeScriptλŠ” 객체의 속성과 λ©”μ„œλ“œ ν˜•νƒœκ°€ κ°™μœΌλ©΄ λ™μΌν•œ νƒ€μž…μœΌλ‘œ κ°„μ£Όν•˜λŠ” "덕 타이핑(Duck Typing)" λ°©μ‹μ˜ ꡬ쑰적 타이핑을 μ±„νƒν•œλ‹€[1, 2, 5]. 이 νƒ€μž… μ‹œμŠ€ν…œμ€ μ§‘ν•©λ‘ μœΌλ‘œ 해석될 수 있으며, `never`λŠ” 곡집합, `unknown`은 전체 집합을 μ˜λ―Έν•˜κ³ , `A extends B`λŠ” $A \subseteq B$ (λΆ€λΆ„μ§‘ν•©)의 κ΄€κ³„λ‘œ λ™μž‘ν•œλ‹€[5, 7, 8]. - **νƒ€μž… κ°„μ˜ ν˜Έν™˜μ„±κ³Ό μˆ˜λΉ„ μ „λž΅:** μœ μ—°ν•œ ꡬ쑰적 νƒ€μ΄ν•‘μœΌλ‘œ μΈν•œ μ˜λ„μΉ˜ μ•Šμ€ 데이터 μœ μž…μ„ 막기 μœ„ν•΄, TypeScriptλŠ” 객체 λ¦¬ν„°λŸ΄ ν• λ‹Ή μ‹œ μ •μ˜λ˜μ§€ μ•Šμ€ 속성을 μ°¨λ‹¨ν•˜λŠ” κ³Όμž‰ 속성 체크(Excess Property Checking)λ₯Ό μˆ˜ν–‰ν•œλ‹€[3, 5]. κ°„μ ‘ ν• λ‹Ή μ‹œ EPCκ°€ μš°νšŒλ˜λŠ” ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λ„μž…λœ `satisfies` μ—°μ‚°μžλŠ” λŒ€μƒμ˜ μš”κ΅¬μ‚¬ν•­ μΆ©μ‘± μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜λ©΄μ„œλ„ ꡬ체적인 λ¦¬ν„°λŸ΄ νƒ€μž…μ„ μœ μ§€ν•˜λ„λ‘ 보μž₯ν•œλ‹€[4, 6, 10]. λ˜ν•œ, ꡬ쑰가 같더라도 μ˜λ―Έκ°€ λ‹€λ₯Έ 데이터(예: 이메일과 일반 λ¬Έμžμ—΄)λ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types) ν˜Ήμ€ Opaque Typesλ₯Ό μ‚¬μš©ν•˜μ—¬ 컴파일 μ‹œμ μ— κ³ μœ ν•œ ν‘œμ‹(`__brand` λ“±)을 λΆ€μ—¬ν•˜λŠ” λͺ…λͺ©μ  타이핑을 κ΅¬ν˜„ν•  수 μžˆλ‹€[10-13]. - **μƒνƒœ λ³΄ν˜Έμ™€ λΆˆλ³€μ„± (Immutability):** `readonly` μˆ˜μ‹μ–΄λ₯Ό 톡해 객체와 λ°°μ—΄μ˜ μˆ˜μ •μ„ 컴파일 μˆ˜μ€€μ—μ„œ κΈˆμ§€ν•¨μœΌλ‘œμ¨ λ°μ΄ν„°μ˜ 무결성을 보μž₯ν•œλ‹€[14-16]. 기본적인 `readonly`λŠ” 얕은(shallow) μˆ˜μ€€μ˜ 보호만 μ œκ³΅ν•˜λ―€λ‘œ, μ€‘μ²©λœ 객체λ₯Ό μ™„λ²½νžˆ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄μ„œλŠ” μž¬κ·€μ  λΆˆλ³€μ„±μ„ 보μž₯ν•˜λŠ” `DeepReadonly` μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ„ ν™œμš©ν•˜μ—¬ 데이터λ₯Ό 동결할 수 μžˆλ‹€[16-18]. - **식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨κ³Ό μ™„μ „μ„± 검사 (Discriminated Unions & Exhaustiveness Checking):** μ—¬λŸ¬ μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” ν•©μ§‘ν•© νƒ€μž…μ„ λ‹€λ£° λ•Œ, κ³΅ν†΅λœ λ¦¬ν„°λŸ΄ 속성을 νƒœκ·Έ(Discriminant)둜 μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ μ•ˆμ „ν•˜κ²Œ μ’ν˜€λ‚˜κ°„λ‹€(Narrowing)[19-21]. 이에 더해 `never` νƒ€μž…μ„ ν™œμš©ν•œ μ™„μ „μ„± 검사(Exhaustiveness Checking) 기법을 λ„μž…ν•˜λ©΄, μœ λ‹ˆμ˜¨μ— μƒˆλ‘œμš΄ λΆ„κΈ°λ‚˜ μƒνƒœκ°€ μΆ”κ°€λ˜μ—ˆμ„ λ•Œ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ λ‘œμ§μ„ 컴파일 μ—λŸ¬λ‘œ ν¬μ°©ν•˜μ—¬ λΉˆν‹ˆμ—†λŠ” λ°©μ–΄κ°€ κ°€λŠ₯ν•˜λ‹€[21-23]. - **μΈν„°νŽ˜μ΄μŠ€ 섀계와 νƒ€μž… 별칭 (Interface vs Type Alias):** TypeScript μ»΄νŒŒμΌλŸ¬λŠ” μΈν„°νŽ˜μ΄μŠ€(`interface`) 처리 μ‹œ 이름을 κΈ°μ€€μœΌλ‘œ 관계λ₯Ό μΊμ‹±ν•˜κΈ° λ•Œλ¬Έμ— 도메인 λͺ¨λΈμ΄λ‚˜ 객체 계약 μ •μ˜μ— μ„±λŠ₯상 μœ λ¦¬ν•˜λ©° μ„ μ–Έ 병합(Declaration Merging) ν™•μž₯을 μ§€μ›ν•œλ‹€[24-27]. 반면 κ΅μ§‘ν•©μ΄λ‚˜ ν•©μ§‘ν•© λ“± 더 μ—„κ²©ν•˜κ³  λ³΅μž‘ν•œ 쑰합을 μ œμ–΄ν•  ν•„μš”κ°€ μžˆλŠ” κ³³μ—λŠ” νƒ€μž… 별칭(`type`)을 μ‚¬μš©ν•˜λŠ” μ „λž΅μ  이원화가 ꢌμž₯λœλ‹€[26-29]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[ꡬ쑰적 타이핑 (Structural Typing)]], [[식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨ (Discriminated Unions)]], [[λΈŒλžœλ””λ“œ νƒ€μž… (Branded Types)]], [[κ³Όμž‰ 속성 체크 (Excess Property Checking)]], [[satisfies μ—°μ‚°μž]], [[λΆˆλ³€μ„± (Immutability)]] - **Projects/Contexts:** [[λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발]], [[SOLID 원칙 기반 μΈν„°νŽ˜μ΄μŠ€ 섀계]], [[Toss Front SDK 섀계]] - **Contradictions/Notes:** μΈν„°νŽ˜μ΄μŠ€(`interface`)와 νƒ€μž… 별칭(`type`)의 선택과 κ΄€λ ¨ν•˜μ—¬, μ„ μ–Έ λ³‘ν•©μœΌλ‘œ μΈν•œ 예기치 μ•Šμ€ ꡬ쑰 μ˜€λ²„λΌμ΄λ”©μ„ ν”Όν•˜κΈ° μœ„ν•΄ 였직 `type`λ§Œμ„ μ—„κ²©ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” νŒ€ λ¬Έν™”κ°€ μ‘΄μž¬ν•˜λŠ” 반면[30, 31], 컴파일러 캐싱 μ΅œμ ν™” κ΄€μ μ—μ„œλŠ” 객체 상속 μ‹œ `interface`λ₯Ό μš°μ„ ν•  것을 κ°•λ ₯히 κΆŒκ³ ν•˜λŠ” 이견이 μ‘΄μž¬ν•œλ‹€[25, 26, 28]. λ˜ν•œ `ts-pattern` λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ² μ €ν•œ νƒ€μž… μΆ”λ‘ κ³Ό 가독성을 μ£Όμ§€λ§Œ λ„€μ΄ν‹°λΈŒ `if/switch` ꡬ문에 λΉ„ν•΄ μ„±λŠ₯이 ν˜„μ €νžˆ λ–¨μ–΄μ§€λ―€λ‘œ(μ΄ˆλ‹Ή μ—°μ‚° 횟수 κΈ°μ€€ 99% μ €ν•˜ λ“±), κ°„λ‹¨ν•œ 뢄기문에 λ‚¨μš©ν•  경우 λΆˆν•„μš”ν•œ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œλ₯Ό μœ λ°œν•  수 μžˆλ‹€λŠ” λΉ„νŒμ  견해가 μžˆλ‹€[32-34]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/TypeScript νƒ€μž… μ‹œμŠ€ν…œ (TypeScript Type System).md]] ---