νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†Œκ°œ

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ = μžλ°”μŠ€ν¬λ¦½νŠΈμ— νƒ€μž… syntaxκ°€ μΆ”κ°€λœ 것
  • μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  κ³³μ—μ„œ μ‹€ν–‰κ°€λŠ₯
  • @ts-check -> @param 으둜 νƒ€μž…μ„ 점차 μ„€μ • κ°€λŠ₯
  • μ‚¬μš© 이유: μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… 언어라 λŸ°νƒ€μž„μ— λ³€μˆ˜μ˜ νƒ€μž…μ΄ 결정됨, νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 정적 νƒ€μž… 언어라 컴파일 νƒ€μž„μ— λ³€μˆ˜μ˜ νƒ€μž…μ΄ 결정됨 (νƒ€μž… μ—λŸ¬ 미리 λ°œκ²¬κ°€λŠ₯) + νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” es6을 es5λ‚˜ es3으둜 λ³€ν™˜ν•΄ ν¬λ‘œμŠ€λΈŒλΌμš°μ§• 문제λ₯Ό ν•΄κ²°κ°€λŠ₯ (babel이 ν•„μš”μ—†μŒ) + 가독성을 λ†’μ—¬μ€Œ, μœ μ§€λ³΄μˆ˜κ°€ μ€‘μš”ν•œ ν”„λ‘œμ νŠΈμ— 적합함 (μž‘μ€ ν”„λ‘œμ νŠΈλŠ” μ˜€λ²„ μ—”μ§€λ‹ˆμ–΄λ§)

νƒ€μž…μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ νƒ€μž…

  • string, number, boolean
    • κΈ°λ³Έ νƒ€μž… μ†Œλ¬Έμžμž„
  • object
    • 보톡 interfaceλ₯Ό μ‚¬μš©
    • key type ν˜•νƒœλ‘œ object property의 νƒ€μž… 지정
  • Array, Tuple, enum
    • Array (e.g. number[])
    • Tuple은 길이와 νƒ€μž…μ΄ κ³ μ •λœ λ°°μ—΄ (e.g. [string, number, number]
    • enum은 이름이 μžˆλŠ” μƒμˆ˜λ“€μ΄ μ—΄κ±°λ˜μ–΄ μžˆλŠ” 집합 (e.g. enum EnumType {A,B,C})
  • any, void, never
    • any νƒ€μž…μ€ λΉ„μΆ”μ²œ (noImplicityAny: trueλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ)
    • void = μ–΄λ–€ νƒ€μž…λ„ 쑴재 ν•  수 μ—†μŒ, 보톡 ν•¨μˆ˜μ—μ„œ 리턴값이 μ—†μ„λ•Œ μ‚¬μš©
    • never = μ–΄λ–€ 값도 κ°€μ§ˆ 수 μ—†λŠ” νƒ€μž…, 보톡 ν•¨μˆ˜μ˜ 리턴값에 μ‚¬μš© (μ—λŸ¬λ‚˜ λ¬΄ν•œλ£¨ν”„ = μ’…λ£Œκ°€ 될 수 μ—†λŠ” 상황)
  • null, undefined
    • strictNullChecks μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ nullκ³Ό undefined λ³€μˆ˜ μ°Έμ‘°μ‹œ μ—λŸ¬ λ°œμƒν•˜κ²Œ ν•˜λŠ” 것이 μ’‹μŒ
  • Symbol
    • λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μœ μΌν•œ κ°’
    • 보톡 객체의 key둜 자주 μ‚¬μš©λ¨
  • unknown
    • μ–΄λ–€ 값이든 λ“€μ–΄μ˜¬ 수 μžˆμœΌλ‹ˆ κ²€μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λΌλŠ” νƒ€μž…
    • νƒ€μž…μ„ νŠΉμ •ν•˜κΈ° μ „μ—λŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΄ (any와 닀름)

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜ μ„ μ–Έν•˜κΈ°

  • type alias둜 tuple νƒ€μž…μ„ interface μ‚¬μš©ν•œ κ²ƒμ²˜λŸΌ μ‚¬μš© κ°€λŠ₯
  • μžλ™ νƒ€μž… μΆ”λ‘ μœΌλ‘œ 인해 μˆ˜λ™μ μœΌλ‘œ μž…λ ₯μ•ˆν•΄λ„ λ˜λŠ” 뢀뢄이 있음 (κ°’μœΌλ‘œ νƒ€μž…μ΄ 좔둠됨)
  • type으둜 ν•¨μˆ˜ νƒ€μž…μ„ μž‘μ„± κ°€λŠ₯ (e.g. type FnType = (a: string) => number;), 보톡 ν•¨μˆ˜ 자체λ₯Ό 인자둜 λ„˜κΈΈλ•Œ μ‚¬μš©
  • 선택적 λ§€κ°œλ³€μˆ˜ (job?: string), κΈ°λ³Έ λ§€κ°œλ³€μˆ˜ job=β€œstudent”)
  • λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜ (…rest은 항상 λ°°μ—΄ ν˜•νƒœλ‘œ μž‘μ„± 해야함), 배열에 λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값이 λ“€μ–΄μ˜€λ©΄ …rest (number | string)[] κ³Ό 같은 ν˜•νƒœλ‘œ 적어주어야함

μœ λ‹ˆμ–Έ νƒ€μž…κ³Ό ꡐ차 νƒ€μž…

  • μœ λ‹ˆμ–Έ νƒ€μž… (|)
  • ꡐ차 타업 (&) (두 νƒ€μž…μ„ ν•©μ³μ„œ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“€μ–΄μ€Œ, ν΄λž˜μŠ€κ°€ μƒμ†λ°›λŠ” λŠλ‚Œ) (type Person = {a:string} , type Student = Person & {school:string}
    • κΈ°λ³Έ νƒ€μž…μ„ ν•©μΉ˜λŠ” 것은 μ•ˆλ¨

Type Aliases

  • μ€‘λ³΅λ˜κ±°λ‚˜ λ³΅μž‘ν•œ νƒ€μž…λ“€μ— 이름을 μ§€μ–΄μ€˜μ„œ μž¬μ‚¬μš©ν•˜λŠ” 것
  • type Person = {name:string, age:number}
  • type aliase와 interface의 차이점
    • interfaceλŠ” extends 말고 κ·Έλƒ₯ λ™μΌν•œ interfaceλ₯Ό μ„ μ–Έν•΄μ„œ ν™•μž₯ν•  수 있음 (선언적 ν™•μž₯), interfaceλŠ” κ°μ²΄μ—λ§Œ μ‚¬μš©κ°€λŠ₯

λ¦¬ν„°λŸ΄ νƒ€μž…

  • as const
  • readonly만 κ°€λŠ₯ν•œ νƒ€μž…
  • λ°±μ—”λ“œμ™€ 값듀을 정해놓고 μ‚¬μš©ν• λ•Œ λ¦¬ν„°λŸ΄ νƒ€μž…μœΌλ‘œ 정해놓고 자주 μ‚¬μš©ν•¨

클래슀

  • μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„± ν›„ quick fix둜 TypeScript ν˜•μ‹μœΌλ‘œ μˆ˜μ • κ°€λŠ₯
  • 클래슀 상속
  • public, protected, private μ ‘κ·Ό μ œν•œμž
    • public이 κΈ°λ³Έκ°’
    • protected = μƒμ†λ°›λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œκΉŒμ§€λ§Œ μ ‘κ·Όκ°€λŠ₯, μ™ΈλΆ€μ—μ„œλŠ” μ‚¬μš© λΆˆκ°€λŠ₯
    • private = 본인 ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
  • readonly μ§€μ •μž
    • constructor μ™ΈλΆ€μ—μ„œ κ°’ 할당이 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λ„λ‘ν•¨
  • getters/setters
    • private둜 μ„€μ •ν•œ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ±°λ‚˜ 값을 λ³€κ²½ν• λ•Œ μ‚¬μš©
  • μ „μ—­ ν”„λ‘œνΌν‹°
    • static ν‚€μ›Œλ“œ μ‚¬μš©, μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜μ§€ μ•Šκ³  클래슀의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œμ— μ ‘κ·Ό κ°€λŠ₯
  • 좔상 클래슀
    • abstract class
    • μ •μ˜λ§Œ λ˜μ–΄ 있고 κ΅¬ν˜„λ˜μ–΄ μžˆμ§€ μ•ŠμŒ
    • 좔상 클래슀λ₯Ό 상속 받은 클래슀 μ—μ„œλŠ” 좔상 클래슀 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ 해야됨
  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©
    • μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜ 된 λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μž¬μ •μ˜ ν•˜λŠ” 것

μ œλ„€λ¦­

  • λ‹€μ–‘ν•œ νƒ€μž…μ—μ„œ μž‘λ™ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν• λ•Œ μ‚¬μš©
  • inputκ³Ό output의 νƒ€μž…μ΄ κ°™μ•„μ•Ό λ λ•Œμ™€ 같은 상황에 μ‚¬μš© (function foo (arg:T):T {}), const foo: arg:T => T = (args) => {})
  • μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜
    • ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜λ‘œ μ—¬λŸ¬κ°œμ˜ μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜ μ‚¬μš© κ°€λŠ₯
  • μ œλ„€λ¦­ 클래슀
    • class List
  • μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€
    • interface Person
  • μ œλ„€λ¦­ μ œμ•½μ‘°κ±΄
    • T extends interface 와 같이 μ œλ„€λ¦­ νƒ€μž…μ„ interface둜 ν™•μž₯ν•  수 있음

끝

😊