Skip to content

Latest commit

Β 

History

History
129 lines (71 loc) Β· 8.33 KB

typescript.md

File metadata and controls

129 lines (71 loc) Β· 8.33 KB

TypeScript

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μž₯점

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

κ°€μž₯ 큰 μ΄μœ λŠ” 정적 νƒ€μž… μ‹œμŠ€ν…œμ„ μ§€μ›ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€.

μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전인 컴파일 νƒ€μž„μ— νƒ€μž… κ΄€λ ¨ 였λ₯˜λ₯Ό 미리 λ°œκ²¬ν•΄μ„œ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λŸ°νƒ€μž„μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ§Žμ€ 버그λ₯Ό 쀄여 μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ°¨μ΄λŠ” λ¬΄μ—‡μΈκ°€μš”?

JavaScript와 TypeScript의 κ°€μž₯ 큰 차이점은 2κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

첫번째둜, JavaScript의 경우 동적 νƒ€μž…μœΌλ‘œ λ³€μˆ˜μ˜ νƒ€μž…μ΄ λŸ°νƒ€μž„μ— κ²°μ •λ˜μ§€λ§Œ, TypeScriptλŠ” 정적 νƒ€μž…μœΌλ‘œ 컴파일 λ‹¨κ³„μ—μ„œ νƒ€μž…μ„ κ²€μ‚¬ν•©λ‹ˆλ‹€.

λ‘λ²ˆμ§Έλ‘œ, 컴파일 λ‹¨κ³„μ—μ„œ JavaScriptλŠ” λΈŒλΌμš°μ €λ‚˜ Node.jsμ—μ„œ λ°”λ‘œ μ‹€ν–‰λ˜μ§€λ§Œ TypeScriptλŠ” JavaScript둜 트랜슀파일 된 후에 μ‹€ν–‰λ©λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±λœ μ½”λ“œμ˜ μ„±λŠ₯은 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λΉ„κ΅ν–ˆμ„ λ•Œ μ–΄λ–€κ°€μš”?

TypeScript둜 μž‘μ„±λœ μ½”λ“œμ˜ μ„±λŠ₯은 JavaScript와 λ™μΌν•©λ‹ˆλ‹€.

TypeScriptλŠ” 컴파일 νƒ€μž„μ— νƒ€μž… 검사λ₯Ό 톡해 μ½”λ“œμ˜ ν’ˆμ§ˆμ„ λ†’μ΄μ§€λ§Œ, μ΅œμ’…μ μœΌλ‘œ λ³€ν™˜λ˜λŠ” μ½”λ“œλŠ” JavaScript둜 컴파일되기 λ•Œλ¬Έμ— μ‹€ν–‰ μ„±λŠ₯μ—λŠ” 차이가 μ—†μŠ΅λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ™μž‘ 원리

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž… μ‹œμŠ€ν…œμ€ λŸ°νƒ€μž„μ— μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜μš”?

TypeScript의 νƒ€μž… μ‹œμŠ€ν…œμ€Β μ»΄νŒŒμΌ νƒ€μž„μ—λ§Œ λ™μž‘ν•˜λ©°, λŸ°νƒ€μž„μ—λŠ” νƒ€μž… 정보가 μ œκ±°λ©λ‹ˆλ‹€. TypeScriptλŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 νƒ€μž… 검사λ₯Ό 톡해 였λ₯˜λ₯Ό κ²€μΆœν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 컴파일 ν›„ μƒμ„±λ˜λŠ” JavaScript μ½”λ“œμ—λŠ”Β νŠΈλžœμŠ€νŒŒμΌλ§λ˜μ–΄ νƒ€μž… 정보가 ν¬ν•¨λ˜μ§€ μ•ŠμœΌλ―€λ‘œ, μ‹€μ œ μ‹€ν–‰ μ‹œμ—λŠ” νƒ€μž… 검사가 이루어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 컴파일링 과정에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.
  1. νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œ μž‘μ„±:Β λ¨Όμ € κ°œλ°œμžλŠ”Β .tsΒ λ˜λŠ”Β .tsxΒ ν™•μž₯자λ₯Ό κ°€μ§„ νŒŒμΌμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈ 문법을 μ‚¬μš©ν•΄μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
  2. νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러(TSC) μ‹€ν–‰:Β μž‘μ„±λœ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ”νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러(tsc)λ₯Ό μ‚¬μš©ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜ν•˜λŠ” 과정이 ν•„μš”ν•©λ‹ˆλ‹€. 이 컴파일 λ‹¨κ³„μ—μ„œ νƒ€μž… 검사와 같은 μž‘μ—…λ“€μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  3. μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ 생성: 컴파일 κ³Όμ •μ˜ 결과둜, νƒ€μž… 정보가 제거되고 μ„€μ •λœ νƒ€κ²Ÿ λ²„μ „μ˜ 문법을 λ”°λ₯΄λŠ”Β .js 파일이 μƒμ„±λ©λ‹ˆλ‹€.
  4. μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ μ‹€ν–‰:Β μ΄λ ‡κ²Œ μƒμ„±λœΒ μˆœμˆ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λΈŒλΌμš°μ €λ‚˜ Node.js ν™˜κ²½μ—μ„œ λ‘œλ“œν•˜μ—¬Β μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” 더 이상 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ 직접적인 관련은 μ—†κ³ , 일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ κ³Όμ •κ³Ό λ™μΌν•˜κ²Œ μ§„ν–‰λ©λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 핡심 κ°œλ…

interface와 type의 차이점에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

interfaceλŠ” 객체 ν˜•νƒœμ˜ ν™•μž₯에 μœ λ¦¬ν•˜κ³ , type은 νŠœν”Œ, μœ λ‹ˆμ˜¨ λ“± 더 λ³΅μž‘ν•œ νƒ€μž… 쑰합에 μœ λ¦¬ν•©λ‹ˆλ‹€.

  1. ν™•μž₯(상속) ν•˜λŠ” 법

    interfaceλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ ν™•μž₯ν•˜κ³ , type은 & 기호둜 ν™•μž₯ν•  수 μžˆλ‹€.

  2. 선언적 ν™•μž₯

    interfaceλŠ” 같은 μ΄λ¦„μœΌλ‘œ 쀑볡 μ„ μ–Έ μ‹œ μžλ™μœΌλ‘œ λ³‘ν•©λ˜λ©° ν™•μž₯에 μœ λ¦¬ν•˜μ§€λ§Œ, type은 쀑볡 μ„ μ–Έ μ‹œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

  3. λ³΅μž‘ν•œ νƒ€μž… μ„ μ–Έ

    type은 νŠœν”Œ, μœ λ‹ˆμ˜¨( | ), 쑰건뢀 νƒ€μž… λ“± λ‹€μ–‘ν•œ κ³ κΈ‰ νƒ€μž… 선언이 κ°€λŠ₯ν•˜μ§€λ§Œ, interfaceλŠ” 객체 νƒ€μž…μœΌλ‘œλ§Œ μ œν•œλ©λ‹ˆλ‹€. (단, interfaceμ—μ„œ μœ λ‹ˆμ˜¨ νƒ€μž…μ€ 객체의 속성 νƒ€μž…μœΌλ‘œλŠ” μ‚¬μš© κ°€λŠ₯ν•˜λ©°, νƒ€μž… 자체λ₯Ό μœ λ‹ˆμ˜¨μœΌλ‘œ μ •μ˜ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.)

  4. μžλ£Œν˜•(type)

    interfaceλŠ” 객체 νƒ€μž…μ—λ§Œ μ‚¬μš©ν•  수 있고. type은 객체뿐만 μ•„λ‹ˆλΌ λ¬Έμžμ—΄, 숫자 λ“± μ›μ‹œ νƒ€μž…λ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μ œλ„ˆλ¦­μ€ νƒ€μž…μ„ 마치 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ²˜λŸΌ λ°›μ•„μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯으둜, <T>와 같이 ν‘œκΈ°ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•¨μˆ˜, μΈν„°νŽ˜μ΄μŠ€, 클래슀 λ“±μ—μ„œ λ‹€μ–‘ν•œ νƒ€μž…μ— μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 있으며, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • νƒ€μž…λ§Œ ν—ˆμš©ν•˜λŠ” μ œμ•½ 쑰건도 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ œλ„ˆλ¦­μ€ μœ ν‹Έλ¦¬ν‹° νƒ€μž…κ³Ό ν•¨κ»˜ 자주 μ‚¬μš©λ˜λ©°, λŒ€ν‘œμ μœΌλ‘œ Partial<T>, Readonly<T>처럼 κΈ°μ‘΄ νƒ€μž…μ„ λ³€ν˜•ν•΄μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μœ λ‹ˆμ–Έ νƒ€μž…( | )κ³Ό μΈν„°μ„Ήμ…˜ νƒ€μž…(&)의 차이λ₯Ό μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μœ λ‹ˆμ–Έ νƒ€μž…μ€ λ‘˜ 쀑 ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜λ©΄ λ˜λŠ” νƒ€μž…μž…λ‹ˆλ‹€. μΈν„°μ„Ήμ…˜ νƒ€μž…μ€ 두 νƒ€μž…μ„ λͺ¨λ‘ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”
  • PartialΒ : 객체 νƒ€μž…μ˜ λͺ¨λ“  속성을 μ„ νƒμ μœΌλ‘œ λ§Œλ“œλŠ” νƒ€μž…μž…λ‹ˆλ‹€.
  • PickΒ : 객체 νƒ€μž…μ—μ„œ νŠΉμ • μ†μ„±λ§Œ μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“­λ‹ˆλ‹€.
  • OmitΒ : 객체 νƒ€μž…μ—μ„œ νŠΉμ • μ†μƒλ§Œ μ œμ™Έν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“­λ‹ˆλ‹€.
νƒ€μž… 단언과 νƒ€μž… κ°€λ“œμ˜ 차이점은 λ¬΄μ—‡μΈκ°€μš”?

νƒ€μž… 단언은 asλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ κ°•μ œλ‘œ μ§€μ •ν•˜λŠ” 것이고,

νƒ€μž… κ°€λ“œλŠ”Β typeof,Β instanceof, λ˜λŠ”Β μ‚¬μš©μž μ •μ˜ νƒ€μž… κ°€λ“œλ₯Ό 톡해 μ‹€μ œ νƒ€μž…μ„ μ²΄ν¬ν•˜κ³  μ’ν˜€μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ private, protected, public ν‚€μ›Œλ“œλŠ” μ–΄λ–€ 역할을 ν•˜λ‚˜μš”?
  • public의 경우 클래슀의 λͺ¨λ“  μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλŠ” μ™ΈλΆ€μ—μ„œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • private의 경우 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, 클래슀 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†κ³ , μƒμ†λœ ν΄λž˜μŠ€μ—μ„œλ„ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • protected의 경우 privateκ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ, μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
νƒ€μž… μΆ”λ‘ (Type Inference)μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

νƒ€μž… 좔둠은 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬κ°€ κ°œλ°œμžκ°€Β μ½”λ“œμ— λͺ…μ‹œμ μœΌλ‘œ νƒ€μž… 주석을 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„, μ½”λ“œλ₯Ό λΆ„μ„ν•΄μ„œ ν•΄λ‹Ή λ³€μˆ˜λ‚˜ ν‘œν˜„μ‹μ˜ νƒ€μž…μ„ 슀슀둜 μ•Œμ•„μ„œ κ²°μ •ν•˜λŠ” κΈ°λŠ₯을 λ§ν•©λ‹ˆλ‹€. κ°„λ‹¨νžˆ 말해, νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 'μ•Œμ•„μ„œ νƒ€μž…μ„ μ§μž‘ν•΄μ£ΌλŠ”' κ±°μ£ .

예λ₯Ό λ“€μ–΄ let name = "Alice" 와 같이 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ λ°”λ‘œ 값을 ν• λ‹Ήν•˜λ©΄, nameΒ λ³€μˆ˜μ˜ νƒ€μž…μ€Β stringμœΌλ‘œΒ μžλ™μœΌλ‘œ μΆ”λ‘ ν•©λ‹ˆλ‹€.

`any` νƒ€μž…μ˜ μ‚¬μš©μ„ μ–΄λ–»κ²Œ ν”Όν•˜κ³  κ³„μ‹ κ°€μš”?

첫째, κ°€λŠ₯ν•œ ꡬ체적인 νƒ€μž…μ„ λͺ…μ‹œν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ›μ‹œ νƒ€μž…μ˜ κ²½μš°μ—λ„ string, number와 같이 λͺ…μ‹œλ₯Ό ν•΄μ£Όκ³  객체의 κ²½μš°μ—λŠ” 별칭을 μ‚¬μš©ν•˜μ—¬ λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•©λ‹ˆλ‹€.

λ‘˜μ§Έ, λ°μ΄ν„°μ˜ νƒ€μž…μ„ μ •ν™•νžˆ μ•Œ 수 없을 λ•ŒλŠ” unknown νƒ€μž…μ„ μš°μ„ μ μœΌλ‘œ κ³ λ €ν•©λ‹ˆλ‹€. unknown은 νƒ€μž… κ°€λ“œλ₯Ό μ‚¬μš©ν•΄μ„œ νƒ€μž…μ„ λ¨Όμ € ν™•μΈν•˜κ³  μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•΄μ£ΌκΈ°μ— μ•ˆμ „ν•œ λŒ€μ•ˆμž…λ‹ˆλ‹€.

TypeScriptμ—μ„œ undefined, nullλ₯Ό λ‹€λ£¨λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 이 두 값이 λŸ°νƒ€μž„ μ—λŸ¬μ˜ μ£Όμš” 원인이 되곀 ν•˜λŠ”λ°μš”, νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄Β strictNullChecksΒ λΌλŠ” 맀우 μ€‘μš”ν•œ 컴파일러 μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.Β tsconfig.jsonΒ νŒŒμΌμ—μ„œ 이 μ˜΅μ…˜μ„Β true둜 μ„€μ •ν•˜λŠ” 것이 κ°•λ ₯히 ꢌμž₯λ©λ‹ˆλ‹€.

strictNullChecksλ₯Ό 켰을 λ•Œ, stringμ΄λ‚˜ number 같은 λ‹€λ₯Έ νƒ€μž…μ˜ λ³€μˆ˜μ— nullμ΄λ‚˜ undefinedλ₯Ό ν• λ‹Ήν•  수 μ—†κ²Œ λ©λ‹ˆλ‹€. λ§Œμ•½ μ–΄λ–€ λ³€μˆ˜κ°€ null λ˜λŠ” undefined 값을 κ°€μ§ˆ 수 μžˆλ‹€λ©΄, λ°˜λ“œμ‹œ μœ λ‹ˆμ–Έ νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ λͺ…μ‹œμ μœΌλ‘œ ν‘œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.