LearningTS Chapter 14 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki

14μž₯. ꡬ문 ν™•μž₯

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 같은 μƒμœ„ μ§‘ν•© 언어에 νŠΉμ • μƒˆλ‘œμš΄ λŸ°νƒ€μž„ κΈ°λŠ₯으둜 μžλ°”μŠ€ν¬λ¦½νŠΈ ꡬ문을 ν™•μž₯ν•˜λŠ” 방식은 λ‹€μŒκ³Ό 같은 이유둜 인해 λ‚˜μœ μ‚¬λ‘€λ‘œ κ°„μ£Όν•œλ‹€.

  • λŸ°νƒ€μž„ ꡬ문 ν™•μž₯이 μ΅œμ‹  버전 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μƒˆλ‘œμš΄ ꡬ문과 μΆ©λŒν•  수 μžˆλ‹€.
  • μ–Έμ–΄λ₯Ό 처음 μ ‘ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λλ‚˜λŠ” κ³³κ³Ό λ‹€λ₯Έ μ–Έμ–΄κ°€ μ‹œμž‘ν•˜λŠ” 곳을 μ΄ν•΄ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“ λ‹€.
  • μƒμœ„ μ§‘ν•© μ–Έμ–΄ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λ‚΄λ³΄λ‚΄λŠ” 트랜슀파일러의 λ³΅μž‘μ„±μ„ μ¦κ°€μ‹œν‚¨λ‹€.

14.1 클래슀 λ§€κ°œλ³€μˆ˜ 속성

μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€μ—μ„œλŠ” μƒμ„±μžμ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›κ³  μ¦‰μ‹œ 클래슀 속성을 ν• λ‹Ήν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

class Enginner {
  readonly area: string;

  constructor(area: string) {
    this.area = area;
  }
}

new Enginner("mechancial").area;

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ λ§€κ°œλ³€μˆ˜ 속성을 μ„ μ–Έν•˜κΈ° μœ„ν•œ 단좕 ꡬ문을 μ œκ³΅ν•œλ‹€. 속성은 클래슀 μƒμ„±μžμ˜ μ‹œμž‘ 뢀뢄에 λ™μΌν•œ νƒ€μž…μ˜ 멀버 μ†μ„±μœΌλ‘œ ν• λ‹Ήλœλ‹€.

μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ μ•žμ— readonly λ˜λŠ” public, protected, private μ œν•œμž 쀑 ν•˜λ‚˜λ₯Ό λ°°μΉ˜ν•˜λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ λ™μΌν•œ 이름과 νƒ€μž…μ˜ 속성도 μ„ μ–Έν•˜λ„λ‘ μ§€μ‹œν•œλ‹€.

class Enginner {
  constructor(readonly area: string) {
    
  }
}

λ§€κ°œλ³€μˆ˜ 속성은 클래슀 μƒμ„±μžμ˜ 맨 μ²˜μŒμ— ν• λ‹Ήλœλ‹€. λ§€κ°œλ³€μˆ˜ 속성은 λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜ λ˜λŠ” 클래슀 속성과 ν˜Όν•©λ  수 μžˆλ‹€.

class NamedEnginner {
  fullName: string;

  constructor(
    name: string,
    public area: sring,
  ) {
    this.fullName  `${name}, ${area} enginner`
  }
}

14.2 μ‹€ν—˜μ μΈ λ°μ½”λ ˆμ΄ν„°

클래슀λ₯Ό ν¬ν•¨ν•˜λŠ” λ§Žμ€ λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” ν΄λž˜μŠ€μ™€ 클래슀의 멀버λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•œ μΌμ’…μ˜ λŸ°νƒ€μž„ λ‘œμ§μ„ 주석을 λ‹¬κ±°λ‚˜ λ°μ½”λ ˆμ΄νŒ…ν•  수 μžˆλ‹€.

ECMAScript μ—μ„œλŠ” 아직 λ°μ½”λ ˆμ΄ν„°λ₯Ό μŠΉμΈν•˜μ§€ μ•Šμ•˜λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‹€ν—˜μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ experimentalDecorators 컴퍼일러 μ˜΅μ…˜μ„ μ œκ³΅ν•œλ‹€.

14.3 μ—΄κ±°ν˜•

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ—΄κ±°ν˜• ꡬ문을 ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ—΄κ±°ν˜•μ„ λ°°μΉ˜ν•΄μ•Ό ν•˜λŠ” 곳에 일반적인 객체λ₯Ό μ‚¬μš©ν•œλ‹€.

const StatusCode = {
  InternalServerError: 500,
  NotFound: 400,
  OK: 200,
  ...
} as const;

StatusCode.InternalServerError; // 500

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ μ—΄κ±°ν˜• 같은 객체λ₯Ό μ‚¬μš©ν•  λ•Œ κΉŒλ‹€λ‘œμš΄ 점은 값이 ν•΄λ‹Ή 객체의 κ°’ 쀑 ν•˜λ‚˜μ—¬μ•Ό 함을 λ‚˜νƒ€λ‚΄λŠ” ν›Œλ₯­ν•œ νƒ€μž… μ‹œμŠ€ν…œ 방법이 μ—†λ‹€λŠ” 것이닀.

keyof λ‚˜ typeof νƒ€μž… μ œν•œμžλ₯Ό ν•¨κ»˜ ν•¨κ»˜ μ‚¬μš©ν•΄ ν•˜λ‚˜μ˜ 값을 ν•΄ν‚Ήν•˜λŠ” 방법도 μžˆλ‹€. ν•˜μ§€λ§Œ λ§Žμ€ μ–‘μ˜ ꡬ문을 μž…λ ₯ν•΄μ•Ό ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž…μ΄ number λ˜λŠ” string 인 λ¦¬ν„°λŸ΄ 값듀을 κ°–λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ enum ꡬ문을 μ œκ³΅ν•œλ‹€.

컴파일된 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ—΄κ±°ν˜•μ€ 이에 μ‚¬μ‘ν•˜λŠ” 객체둜 컴파일 λœλ‹€. μ—΄κ±°ν˜•μ˜ 각 λ©€λ²„λŠ” ν•΄λ‹Ή 값을 κ°–λŠ” 객체 멀버 ν‚€κ°€ 되고 κ·Έ λ°˜λŒ€μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€.

14.3.3 const μ—΄κ±°ν˜•

μ—΄κ±°ν˜•μ€ λŸ°νƒ€μž„ 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ λ¦¬ν„°λŸ΄ κ°’ μœ λ‹ˆμ–Έμ„ μ‚¬μš©ν•˜λŠ” 일반적인 μ „λž΅λ³΄λ‹€ 더 λ§Žμ€ μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” const μ œν•œμžλ‘œ μ—΄κ±°ν˜•μ„ μ„ μ–Έν•΄ 컴파일된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œ 객체 μ •μ˜μ™€ 속성 쑰희λ₯Ό μƒλž΅ν•˜λ„λ‘ μ§€μ‹œν•œλ‹€.

const enum DisplayHint {
  Opaque = 0,
  Semitransparent,
  Transparent,
}

let displayHint = DisplayHint.Transparent;

컴파일된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—λŠ” μ—΄κ±°ν˜• 선언이 λͺ¨λ‘ λˆ„λ½λ˜κ³  μ—΄κ±°ν˜•μ˜ 값에 λŒ€ν•œ 주석을 μ‚¬μš©ν•œλ‹€.