π§ νμ μ€ν¬λ¦½νΈλ₯Ό μμΈμ?
νμ μ€ν¬λ¦½νΈλ λ΄κ° λ§€μΌ μ¬μ©νμ§λ§ λμκ² "νμ μ€ν¬λ¦½νΈλ₯Ό μμμΈμ?"λΌκ³ νλ€λ©΄ λλ "κ·Έ... μΈμ€μ μμμ"λΌκ³ λ§ λ§ν μ μμ κ² κ°λ€. κ·Έλ¬λ©΄ μνλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉλ₯Ό κ³ λ―Όν΄ λ΄€μ λ, λμκ² λ€μλ μκ°μ "κ³ κ°λ₯Ό λ€μ΄ 곡μλ¬Έμλ₯Όλ₯Ό 보κ²νλΌ"μλ€. 곡μλ¬Έμ νλ² μ½μ§ μκ³ μΌλ§λ μν μ μμκΉ, μ± λ³΄λ€λ λ λΉ λ₯΄κ² μ λ°μ΄νΈλκ³ λκ° λ΄λ μ μ€λͺ ν μ μκ² κ³ λ―Όμ νμ μ΄ λ΄κΈ΄ λ¬Έμλ 곡μλ¬Έμμλ€. κ·Έλμ νλ²λ μ½μ§ μμλ, 곡μλ¬Έμλ₯Ό μ½κ³ νλ² μ 리ν΄λ³΄λ € νλ€. μμ΄λ₯Ό ν΄μνλ€ λ³΄λ μ€μλ μμ μ μκ³ μ°λ€λ³΄λ©΄ λ΄ λ§λλ‘ μ°λ λ§λ€λ λ§κ² μ§λ§, μ΄μ λ§μλ¨Ήμ κ±° ν루μ ννμ΄μ§μ© λκΉμ§ κΌ μμ±ν΄λ³΄λ € νλ€.
The Basics
νμ μ€ν¬λ¦½νΈλ μ νμν κΉ? κ·Έλ₯ μ¬λλ€μ΄ λ§μ΄ μ°κ³ νμ μμ λ§μ΄ μ¬μ©νλκΉλΌκ³ λλ΅ν΄λ νλ¦° λ΅μ μλ κ²μ΄λ€. νμ§λ§ λ΄κ° λκΌλ νμ μ€ν¬λ¦½νΈμ νμμ±μ κ°λ°μμ μμ°μ±μ΄μλ€.
κ°λ°μμ μμ°μ±μ΄λ λ§κ³Ό νμ μ΄ μΆκ°λλ κ²μ΄λ λ¬΄μ¨ μκ΄μΈμ§... μ€νλ € μ½λλμ λ λ§κ³ μΈν λ λμ΄λλ λ°, λ λ λΉ λ₯΄κ² ν΄μ€λ€λ κ±°μ§ μΆμμ§λ§ μ°λ©΄ μΈμλ‘ μ΄ν΄ν μ μμλ€.
νμ μ€ν¬λ¦½νΈ νΈλλΆ μ²«μ₯μ λ΄μ©λ λμΌνλ€. javascriptλ§μΌλ‘λ λ³μμ λ΄κΈ΄κ² ν¨μμΈμ§ κ°μ²΄μΈμ§ μ΄λ€ κ²λ μ μ μλ€κ³ , κ°λ°μκ° κ²°κ΅ κ°μ λκ° λ΄κ²Όλμ§ νμΈν΄μΌ νλ λΆνΈν¨μ λ§νκ³ μμλ€.
function fn(x) {
return x.flip()
}
μλ°μ€ν¬λ¦½νΈ μ μΌλ‘ μ무 λ¬Έμ μλ μ μ½λμ paramμΈ xκ° flipμ΄λΌλ μμ±μ ν¨μλ₯Ό κ°μ§κ³ μμ§ μλ€λ©΄ Type errorκ° λ°μνκ² λ κ²μ΄λ€. λ§μ½ μΈμκ° μ΄λ€ νμ μΈμ§ μμλ€λ©΄ κ³Όμ° μ΄λλ‘ μ¬μ©νμκΉ?
νμ μ€ν¬λ¦½νΈλ μΆκ°μ μΌλ‘ νμ μ μΆκ°μ μΌλ‘ μμ±ν΄μ€μΌ νμ§λ§, κ°λ°μκ° λ³μμ λν νμ μ μΌμΌμ΄ κΈ°μ΅νμ§ μμλ λκ² λμμ£Όκ³ , λ°νμμμ μμ±λλ μλ°μ€ν¬λ¦½νΈ μ½λμ λμ/λ°°ν¬ μ μ μλ¬λ₯Ό μ‘μμ€μΌλ‘μ¨ μμ°μ±μ λμ¬μ£Όκ² λλ€.
[νν λͺ»κ°..]
Non-exception Failures
μλ°μ€ν¬λ¦½νΈλ λ€μν μλ¬λ₯Ό λ§λ€ μ μλλ°, μ΄λ¬ν μλ¬λ€μ νμ μ€ν¬λ¦½νΈκ° λ¨Όμ μ½λλ₯Ό μμ±νλ μμ μ κ°λ°μμκ² μλ €μ€ μ μλ€.
- μλ μμ±μ μ κ·Όνμ λ
μλ°μ€ν¬λ¦½νΈλ κ°μ²΄μ μλ μμ±μ μ κ·Όνκ² λλ©΄ undefined
μ λ°ννλ€. κ·Έλ κΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈλ§μΌλ‘λ μ무 λ¬Έμ μμ΄ μ§λκ°κ² λκ³ μ°λ¦¬κ° μμνμ§ λͺ»νλ μλ¬λ₯Ό λ§μ£Όνκ² λλ€.
- μ€νκ° λ°μνμ λ
μλ°μ€ν¬λ¦½νΈλ μ€νλ₯Ό λ°μν΄λ μμ§ λͺ»νλ€. μλλ©΄ μμμ§λ(?) λͺ¨λ₯΄κΈ° λλ¬Έμ΄λ€. νμ μ΄ μκΈ° λλ¬Έμ μ΄λ€ κ°μ κ°μ§κ³ μμμ§ λͺ°λΌ μ€νμΈμ€ λͺ¨λ₯Έλ€.
- ν¨μκ° νΈμΆλμ§ μμμ λ
ν¨μμ체λ μ°Έμ‘°κ°μΌλ‘ μ μ₯λλ€. νΈμΆλμ§ μκ³ κ°μΌλ‘ μ¬μ©λ μ μλ μν©μ΄λΌλ©΄ μ°λ¦¬κ° μμνμ§ λͺ»ν μΌμ΄ νΌμ³μ§λ€.
Types for Tooling
μμ μΈκΈν μλ¬λ€μ μλ°μ€ν¬λ¦½νΈλ‘ μ½λλ₯Ό μμ±ν λ νν λ°μν μ μλ μν©μ΄λ€. μ΄λ¬ν λ¬Έμ μν©μ ν΄κ²°νλ μ€μν λ°©λ²μ€ νλλ λ°λ‘ μ μ΄μ λ¬Έμ μν©μ λ§λ€μ§ μλ κ²
μ΄λΌκ³ ν μ μλ€.
νμ μ€ν¬λ¦½νΈλ κ°λ° λΉμμ νμ μ μ΄μ©ν΄ μ΄λ€ κ°μ μ κ·Όν μ μλμ§λ₯Ό 보μ¬μ€ μ μκΈ° λλ¬Έμ μ΄λ¬ν μλ¬λ₯Ό λ¨Όμ λ°©μ§νλ λ° ν° λμμ μ€λ€.
tsc
tscλ νμ μ€ν¬λ¦½νΈλ‘ μ°λ¦¬κ° μμ±ν μ½λμ νμ μ 체ν¬ν μ μκ² ν΄μ£Όλ compilerλ₯Ό μλ―Ένλ€. μ€μ νμ μμλ tscλ₯Ό μ΄μ©κ³Ό github action λλ huskyλ₯Ό μ΄μ©ν΄μ μ½λκ° λ³ν©λκΈ° μ νμ μλ¬κ° μλμ§ κ²μ¬νλ€.
- --noEmitOnError
μ΄λ¬ν tscλ λ€μν μ»΄νμΌ μ΅μ μ κ°μ§κ³ μλλ° κ·Έμ€ noEmitOnErrorλ νμ μλ¬κ° μμ κ²½μ°μ μ»΄νμΌνμ§ μλ μ΅μ μ΄λ€.
Explicit Types
μ΄μ νμ μ€ν¬λ¦½νΈλ‘ νμ μ μΈμμ ν λΉν΄λ³΄μ.
function greet(person: string, date: Date) {
console.log(`Hello ${person}, today is ${date.toDateString()}!`)
}
greet("Maddison", Date())
μ μ½λλ₯Ό 보μμ λλ μΈλ©λ³΄λ©΄ μ무문μ μμ΄ λ³΄μ΄μ§λ§ Date()
λ₯Ό ν΅ν΄ λ°νλ κ²°κ³Όκ°μ΄ string
μ΄κΈ° λλ¬Έμ μλ¬κ° λ°μν κ²μ λ³Ό μ μλ€.
νμ
μ€ν¬λ¦½νΈκ° Date()
λ₯Ό μλμΌλ‘ μΆλ‘ ν΄μ€μΌλ‘μ¨ λ°μν μ μλ μλ¬λ₯Ό 미리 μλ €μ€ μ μμλ€.
Erased Types
function greet(person, date) {
console.log(
"Hello ".concat(person, ", today is ").concat(date.toDateString(), "!")
)
}
greet("Maddison", new Date())
μ μ½λλ₯Ό μ»΄νμΌ ν΄λ³΄λ©΄ javascriptμ½λλ‘ μ°λ¦¬κ° μμ±λ μ½λμ λ€λ₯΄κ² μ»΄νμΌλ κ²°κ³Όλ₯Ό λ³Ό μ μλ€.
μ΄λ TSCκ° μ°λ¦¬κ° μ€μ ν ECMAScript λ²μ μ λ§κ² μ»΄νμΌ ν κ²μΌλ‘ λ§μ½ es2015μΌλ‘ μ€μ νλ€λ©΄ μ°λ¦¬κ° μμ±ν κ·Έλλ‘ μ»΄νμΌ λ μ μλ€.
function greet(person, date) {
console.log(`Hello ${person}, today is ${date.toDateString()}!`)
}
greet("Maddison", new Date())
TSCμ μ΅μ λͺκ°μ§
λ§μ§λ§μΌλ‘ basics νμ΄μ§μ λ΄μ©μ tscμ μΈκ°μ§ μ΅μ μ λν΄ μ€λͺ νλ€.
- Strictness: tsconfig.jsonμ
"strict": true
λ‘ μ€μ μ strict λͺ¨λλ‘ μ½λλ₯Ό μμ±νκ² νλ€. - noImplicitAny: νμ μ€μ μ€ μ묡μ μΌλ‘ anyκ° ν λΉλλ κ²μ λ°©μ§νλ μ΅μ μΌλ‘ μ£Όλ‘ ν¨μμ νμ μ΄ μ ν΄μ§μ§ μμ μΈμμ κ°μ μ½λλ₯Ό μλ¬λ‘ μ‘μμ£Όλ μ΅μ μ΄λ€.
- strictNullChecks: nullκ³Ό undefinedμ λλ€ falsyν κ°μ΄ μ§λ§ λ€λ₯Έ κ²°κ³Όλ₯Ό λ§λ€κΈ°λ νκΈ° λλ¬Έμ λμ μ νν νΈλ€λ§ ν μ μκ² μλ¬λ‘ μ‘μμ£Όλ μ΅μ μ΄λ€.