--- id: P-REINFORCE-AUTO-844A65 category: "[[10_Wiki/πŸ’‘ Topics/Design & Experience]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - TypeScript의 μΈν„°νŽ˜μ΄μŠ€ 및 객체 νƒ€μž… 섀계" --- # [[TypeScript의 μΈν„°νŽ˜μ΄μŠ€ 및 객체 νƒ€μž… 섀계]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > TypeScript의 μΈν„°νŽ˜μ΄μŠ€μ™€ 객체 νƒ€μž… μ„€κ³„λŠ” λͺ…μ‹œμ μΈ 이름이 μ•„λ‹Œ 객체의 μ‹€μ œ ν˜•νƒœμ™€ 속성을 κΈ°μ€€μœΌλ‘œ νƒ€μž… ν˜Έν™˜μ„±μ„ κ²°μ •ν•˜λŠ” ꡬ쑰적 타이핑(Structural Typing)을 κ·Όκ°„μœΌλ‘œ ν•©λ‹ˆλ‹€. ν™•μž₯μ„±κ³Ό 컴파일 μ„±λŠ₯을 κ³ λ €ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€(Interface)와 νƒ€μž… 별칭(Type Alias)을 μ „λž΅μ μœΌλ‘œ 선택해야 ν•˜λ©°, `readonly` μˆ˜μ‹μ–΄, 초과 속성 검사(Excess Property Checking), `satisfies` μ—°μ‚°μž λ“±μ˜ 도ꡬλ₯Ό ν™œμš©ν•΄ λŸ°νƒ€μž„ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κ³  κ²¬κ³ ν•˜κ³  예츑 κ°€λŠ₯ν•œ 객체 경계λ₯Ό κ΅¬μΆ•ν•˜λŠ” 것이 μ„€κ³„μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) **ꡬ쑰적 타이핑 (Structural Typing) λ©”μ»€λ‹ˆμ¦˜** TypeScript의 객체 νƒ€μž…μ€ λͺ…λͺ©μ  타이핑(Nominal Typing)κ³Ό 달리 λͺ…μ‹œμ μΈ 상속 μ„ μ–Έ 없이도 객체가 κ°€μ§„ 속성과 λ©”μ„œλ“œμ˜ "ꡬ쑰"κ°€ μΌμΉ˜ν•˜λ©΄ λ™μΌν•œ νƒ€μž…μœΌλ‘œ κ°„μ£Όν•˜λŠ” 덕 타이핑(Duck Typing) 방식을 λ”°λ¦…λ‹ˆλ‹€ [1-3]. 예λ₯Ό λ“€μ–΄, 객체 νƒ€μž… `{}`λŠ” λ‹¨μˆœνžˆ 빈 객체λ₯Ό μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹ˆλΌ "속성에 μ ‘κ·Όν•  μˆ˜λŠ” μžˆμœΌλ‚˜ νŠΉμ • 속성을 κ°•μ œν•˜μ§€ μ•ŠλŠ” κ°’"의 집합을 μ˜λ―Έν•©λ‹ˆλ‹€ [4]. μ΄λŸ¬ν•œ ꡬ쑰적 타이핑은 μœ μ—°μ„±μ„ μ œκ³΅ν•˜μ§€λ§Œ, μ˜λ„ν•˜μ§€ μ•Šμ€ 데이터가 객체에 μœ μž…λ  μœ„ν—˜μ΄ μžˆμ–΄ μ„Έμ‹¬ν•œ νƒ€μž… 섀계가 ν•„μš”ν•©λ‹ˆλ‹€ [3, 5]. **μΈν„°νŽ˜μ΄μŠ€(Interface)와 νƒ€μž… 별칭(Type Alias)의 μ „λž΅μ  선택** 객체의 ν˜•νƒœλ₯Ό μ •μ˜ν•  λ•Œ μΈν„°νŽ˜μ΄μŠ€μ™€ νƒ€μž… 별칭은 각기 λ‹€λ₯Έ μ„±λŠ₯κ³Ό ν™•μž₯μ„± νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€. * **μ„±λŠ₯κ³Ό 캐싱**: TypeScript μ»΄νŒŒμΌλŸ¬λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•  λ•Œ ν•΄λ‹Ή 이름을 κΈ°μ€€μœΌλ‘œ νƒ€μž… 관계λ₯Ό μΊμ‹±ν•˜μ—¬ μž¬μ‚¬μš©ν•©λ‹ˆλ‹€ [6-8]. 반면 νƒ€μž… 별칭을 ν†΅ν•œ ꡐ집합(`&`) 연산은 맀번 객체의 ꡬ쑰λ₯Ό ν‰νƒ„ν™”ν•˜κ³  계산해야 ν•˜λ―€λ‘œ λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œλŠ” 컴파일 μ„±λŠ₯을 μ €ν•˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€ [7-9]. λ”°λΌμ„œ 객체 ν™•μž₯ μ‹œμ—λŠ” ꡐ집합 λŒ€μ‹  μΈν„°νŽ˜μ΄μŠ€μ˜ `extends`λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ„±λŠ₯상 ꢌμž₯λ©λ‹ˆλ‹€ [7, 9, 10]. * **μ„ μ–Έ 병합(Declaration Merging)κ³Ό 관리**: μΈν„°νŽ˜μ΄μŠ€λŠ” λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μ—¬λŸ¬ 번 μ„ μ–Έν•˜λ©΄ ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•©μ³μ§€λŠ” μ„ μ–Έ 병합을 μ§€μ›ν•˜μ—¬, 라이브러리 μ œμž‘μžκ°€ μ‚¬μš©μžμ—κ²Œ ν™•μž₯ 지점을 μ œκ³΅ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€ [11, 12]. κ·ΈλŸ¬λ‚˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œλŠ” 예기치 μ•Šμ€ λ³‘ν•©μœΌλ‘œ μΈν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ νƒ€μž… 별칭을 μ„ ν˜Έν•˜λŠ” 방식도 μœ νš¨ν•˜λ©°, 이λ₯Ό 적절히 μ΄μ›ν™”ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ „λž΅μ΄ ν•„μš”ν•©λ‹ˆλ‹€ [12-14]. **초과 속성 검사(EPC)와 `satisfies` μ—°μ‚°μžλ₯Ό ν†΅ν•œ 경계 λ°©μ–΄** * **초과 속성 검사 (Excess Property Checking)**: 객체 λ¦¬ν„°λŸ΄μ„ 직접 ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜ 인자둜 전달할 λ•Œ λŒ€μƒ μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ˜μ§€ μ•Šμ€ 초과 속성이 ν¬ν•¨λ˜λŠ” 것을 μ°¨λ‹¨ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€ [3, 15]. μ΄λŠ” μ˜€νƒ€λ‚˜ 잘λͺ»λœ 속성 전달을 컴파일 μ‹œμ μ— ν¬μ°©ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€ [16, 17]. ν•˜μ§€λ§Œ λ³€μˆ˜μ— λ¨Όμ € μ„ μ–Έ 및 ν• λ‹Ήν•œ ν›„ μ „λ‹¬ν•˜λ©΄ ꡬ쑰적 νƒ€μ΄ν•‘μ˜ "μ΅œμ†Œ μš”κ±΄ μΆ©μ‘±" 원칙에 따라 이 검사가 μž‘λ™ν•˜μ§€ μ•ŠλŠ” ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€ [5, 18, 19]. * **`satisfies` μ—°μ‚°μž λ„μž…**: μ΄λŸ¬ν•œ ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ `satisfies` μ—°μ‚°μžλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. `satisfies`λŠ” 객체가 νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œμ‘±ν•˜λŠ”μ§€ μ—„κ²©νžˆ κ²€μ‚¬ν•˜λ©΄μ„œλ„, νƒ€μž… 단언(`as`)μ΄λ‚˜ λͺ…μ‹œμ  μ–΄λ…Έν…Œμ΄μ…˜(`:`)κ³Ό 달리 객체가 κ°€μ§„ ꡬ체적인 λ¦¬ν„°λŸ΄ 속성 νƒ€μž…κ³Ό μΆ”κ°€λœ 속성에 λŒ€ν•œ μΆ”λ‘  정보λ₯Ό μžƒμ§€ μ•Šκ²Œ μœ μ§€ν•΄ μ€λ‹ˆλ‹€ [20-22]. **선택적(Optional) 속성과 λΆˆλ³€μ„±(Immutability) 섀계** * **선택적 속성 (`?`)**: μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ λΆˆν™•μ‹€ν•˜κ±°λ‚˜ μ‘°κ±΄λΆ€λ‘œ μ‘΄μž¬ν•˜λŠ” 데이터λ₯Ό λͺ¨λΈλ§ν•  λ•Œ μ‚¬μš©λ˜λ©°, λ‚΄λΆ€μ μœΌλ‘œλŠ” `undefined`μ™€μ˜ μœ λ‹ˆμ˜¨ νƒ€μž…μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄ νƒ€μž… μ•ˆμ „μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [23, 24]. * **읽기 μ „μš© 속성 (`readonly`)**: λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œ 없이 컴파일 μ‹œμ μ— 객체 μ†μ„±μ˜ μˆ˜μ •μ„ κΈˆμ§€ν•˜μ—¬ λΆˆλ³€μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€ [25-27]. 단, `readonly`λŠ” ν•΄λ‹Ή 속성 μžμ²΄μ— λŒ€ν•œ 얕은(shallow) 보호만 μ œκ³΅ν•˜λ―€λ‘œ, μ€‘μ²©λœ 객체 ꡬ쑰 전체λ₯Ό λ³΄ν˜Έν•΄μ•Ό ν•  λ•ŒλŠ” μž¬κ·€μ  νƒ€μž…(DeepReadonly) νŒ¨ν„΄μ„ ꡬ성해 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [28, 29]. **객체지ν–₯ 섀계 원칙(SOLID)의 반영** κ±°λŒ€ν•œ μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜μ— λ„ˆλ¬΄ λ§Žμ€ μ±…μž„μ„ λΆ€μ—¬ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ 변경에 μ·¨μ•½ν•΄μ§‘λ‹ˆλ‹€ [30, 31]. μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙(Interface Segregation Principle)을 μ μš©ν•˜μ—¬, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯μ—λ§Œ μ˜μ‘΄ν•˜λ„λ‘ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘κ²Œ λ‚˜λˆ„κ³  이λ₯Ό ν•©μ„±(Composition)ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 μœ μ—°ν•˜κ³  κ²¬κ³ ν•œ μ„€κ³„μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€ [12, 30, 32]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Design & Experience λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[ꡬ쑰적 타이핑 (Structural Typing)]], [[초과 속성 검사 (Excess Property Checking)]], [[μ„ μ–Έ 병합 (Declaration Merging)]], [[satisfies μ—°μ‚°μž]] - **Projects/Contexts:** [[λŒ€κ·œλͺ¨ TypeScript μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜ ꡬ좕]], [[SOLID 원칙 기반의 νƒ€μž… μ‹œμŠ€ν…œ 섀계]] - **Contradictions/Notes:** μ†ŒμŠ€ κ°„ 의견 λŒ€λ¦½μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. 일뢀 개발자(μ†ŒμŠ€ 52, 138, 141)λŠ” 캐싱 μ„±λŠ₯ μ΅œμ ν™”μ™€ μ™ΈλΆ€ ν™•μž₯을 μœ„ν•œ μ„ μ–Έ 병합 κΈ°λŠ₯ λ•Œλ¬Έμ— 'μΈν„°νŽ˜μ΄μŠ€(Interface) μš°μ„  μ‚¬μš©'을 κ°•λ ₯히 μ£Όμž₯ν•˜μ§€λ§Œ, 또 λ‹€λ₯Έ ν˜„μ—… 개발자(μ†ŒμŠ€ 138, 140, 147)λŠ” μ˜λ„μΉ˜ μ•Šμ€ μ„ μ–Έ λ³‘ν•©μœΌλ‘œ 인해 λŸ°νƒ€μž„ 둜직이 μ˜€μ—Όλ  μœ„ν—˜κ³Ό μΌκ΄€λœ 문법을 이유둜 'λͺ¨λ“  μƒν™©μ—μ„œ νƒ€μž… 별칭(Type)λ§Œμ„ μ‚¬μš©ν•˜λŠ” κ·œμΉ™'을 쑰직 내에 κ°•μ œν•˜λŠ” 것이 μž₯κΈ° μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•˜λ‹€κ³  λ°˜λ°•ν•©λ‹ˆλ‹€. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/TypeScript의 μΈν„°νŽ˜μ΄μŠ€ 및 객체 νƒ€μž… 섀계.md]] ---