(λ¬λ νμ μ€ν¬λ¦½νΈ) 3~4μ₯
π κΈ°μ μ± μ€ν°λ
23λ
1μλΆν° νλ μ€μΈ κ΅μ‘μμ, λ»μ΄ λ§λ λλ£λ€κ³Ό ν¨κ» μ§ννκ² λ μ€ν°λ
μμΌλ‘λ κΎΈμ€ν κΈ°μ μμ μ μ½κ³ ν¨κ» λ°μ νλ μκ°μ΄ λμμΌλ©΄ μ’κ² λ€!
3μ₯. μ λμΈκ³Ό 리ν°λ΄
- μ λμΈ(union): κ°μ νμ©λ νμ μ 2κ° μ΄μμ κ°λ₯ν νμ μΌλ‘ νμ₯
- λ΄λ‘μ(narrowing): κ°μ νμ©λ νμ μ νλ μ΄μμ κ°λ₯ν νμ μ΄ λμ§ μλλ‘ μ’νκΈ°
β λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μμλ λΆκ°λ₯νμ§λ§ TSμμλ κ°λ₯ν μ½λ μ 보μ μ κ°ν μΆλ‘
μ λμΈ
let example = Math.random() > 0.5 ? 'j' : 1116;
// example: string | number
μ£Όμν μ
example.toUpperCase(); // Error
// toUpperCaseλΌλ λ©μλλ number typeμ μκΈ° λλ¬Έμ΄λ€.
// μ¦, exampleμλ number typeμΈ κ°μ΄ ν λΉλ μ μκΈ° λλ¬Έμ μ΄μ λν΄μ μμ μ₯μΉλ₯Ό ν΄μ£Όλ κ²
μμ μμλ₯Ό 보면 μ λμΈμ λ§μΉ βλλβ(||) κ°μ§λ§ κ°μ²΄μ κ°λ μμλ νμͺ½μ΄ μλ λͺ¨λ κ°κ³ μλ νλ‘νΌν°, λ©μλλ§ μ¬μ©ν μ μκΈ°μ μ½κ° && λλμ΄ λλ€.
β string | numberμ κ°μ²΄μ κ°λ μΌλ‘ μκ°νλ©΄ μ΄ν΄κ° λλ κ² κ°λ€!!!
let test: string | number;
μ΄λ κ² λλ©΄ testμλ μ£Όλ‘ string, number 리ν°λ΄ κ°μ΄ ν λΉλ ν
λ°, μλ€λ λͺ¨λ κ°κ° μ΄λ€ νλ‘νΌν°,
λ©μλλ₯Ό κ°κ³ μλ€. κ·Έλ κ² μκ°νλ©΄ λμμ κ°λ μμ±μ΄ μλλ©΄ ν λΉμ΄ μλλ κ² μ΄ν΄λλ€.
type exam1 = {name: string, age: number}
type exam2 = {name: string, agee: number}
let test: exam1 | exam2;
test = {name: 'j', age: 1} // κ°λ₯
test = {name: 'l', agee: 2} // κ°λ₯
test = {name: 'j', age: 1, agee: 2} // κ°λ₯
λ΄λ‘μ
λ§ κ·Έλλ‘ νμ
μ μ’νλ€. μ΄ λ, νμ
λ΄λ‘μκ³Ό 쑰건문μ ν¨κ» μμΌλ‘μ¨ νμ
κ°λ
μ μν μ νκ² ν μ μλ€.
μ λ§μ΄ μ± μμ λ§νλ νμ κ°λ: βνμ μ μ’νλ λ° μ¬μ©ν μ μλ λ Όλ¦¬μ κ²μ¬β
let example = Math.random() > 0.5 ? 'j' : 1116;
// example: string | number
if (example === 'j') {
example.toUpperCase() // stringμΌλ‘ νμ
μ΄ μ’νμ‘κΈ° λλ¬Έμ κ°λ₯
} else {
example.toFixed() // error λ°μ.
}
---
if (example === 'j') {
example.toUpperCase() // stringμΌλ‘ νμ
μ΄ μ’νμ‘κΈ° λλ¬Έμ κ°λ₯
} else if (example === 1116) {
example.toFixed() // μ΄κ±΄ νμ€ν 1116μΌλ‘ λͺ
μνκΈ°μ κ°λ₯
}
---
if (example === 'j') {
example.toUpperCase() // stringμΌλ‘ νμ
μ΄ μ’νμ‘κΈ° λλ¬Έμ κ°λ₯
} else if (example === 555) {
example.toFixed() // μ΄κ±΄ νμ€ν 1116μΌλ‘ λͺ
μνκΈ°μ κ°λ₯
}
리ν°λ΄ νμ
- μ’λ ꡬ체μ μΈ λ²μ μ μμ νμ
let age = 123;
const name = 'jayden';
μμ κ°μ΄ const
λ‘ λ³μλ₯Ό μ μΈ λ° ν λΉνλ κ²½μ° κ·Έ κ° μμ²΄κ° νμ
μ΄ λλ€.(리ν°λ΄ νμ
)
β μ΄μ°¨νΌ constλ‘ μ μΈλ λ³μλ κ°μ΄ λ³κ²½ νΉμ μ΄κΈ°νλ μΌμ΄ μμΌλκΉ
κ·Έλμ μμ νμ
μ ν΄λΉ νμ
μ κ°λ₯ν λͺ¨λ 리ν°λ΄ κ°μ μ§ν©
μΈ κ²μ΄λ€.
μ격ν null κ²μ¬
strictNullChecks: true - null ν λΉ μλ¨ / false - null ν λΉ κ°λ₯ β μ¬μ€μ 무쑰건 trueλ₯Ό νλ κ² μ’λ€.
const test = Math.random() > 0.5 ? 'j' : undefined;
let t = test && test.toUpperCase();
// κ°λ₯( && μ°μ°μλ₯Ό ν΅ν΄ test truthy, falsyλ‘ κ±Έλ¬μ§κΈ° λλ¬Έμ΄λ€. )
---
let p = test?.toUpperCase();
// κ°λ₯( ? μ°μ°μ μμ²΄κ° testκ° undefinedμΌ κ°λ₯μ±μ λ§ν΄μ£Όλ κ²μ΄κΈ° λλ¬Έμ΄λ€. )
νμ λ³μΉ
νμ μ λ³μμ²λΌ μ μΈνλ κ²
4μ₯. κ°μ²΄
μλ°μ€ν¬λ¦½νΈλ κ²°κ΅ λͺ¨λ κ°μ²΄!!! null, undefinedλ₯Ό μ μΈν λͺ¨λ κ°μ κ·Έ κ°μ λν μ€μ νμ μ λ©€λ²(νλ‘νΌν°, λ©μλ)λ₯Ό κ°μ§λ―λ‘ λͺ¨λ κ°μ νμ μ νμΈνκΈ° μν΄μλ κ°μ²΄ νμ μ μ΄ν΄ν΄μΌνλ€.
ꡬ쑰μ νμ΄ν
TSμ νμ
μμ€ν
μ ꡬ쑰μ μΌλ‘ νμ
ν
λμ΄μλ€. νμ
κ²μ¬κΈ°μμ μ μ μμ€ν
μ΄ νμ
μ κ²μ¬νλ€.
λ°λ©΄ JSλ λ νμ΄ν(λ νμ
)
μΌλ‘ λ°νμμμ μ¬μ©λ λκΉμ§ κ°μ²΄ νμ
μ κ²μ¬νμ§ μλλ€.(λμ νμ΄ν)
μ΄κ³Ό μμ± κ²μ¬
type A = {name: string}
type B = {name: string, age: number}
const t = {name: 'j', age: 11}
let ta: A = t; // μλ¬ μλ¨ - μ΄κ³Ό μμ± κ²μ¬ νΌν΄κ°κΈ°
let tb: A = {name: 'l', age: 12} // μλ¬ λ°μ
let tc: B = {name: 'l'} // μ΄κ±΄ λΉμ°ν μλ¬
μ΄κ³Ό μμ± κ²μ¬λ κ°μ²΄ νμ μΌλ‘ μ μΈλ μμΉμμ μμ±λλ κ°μ²΄ 리ν°λ΄μ λν΄μλ§ μΌμ΄λλ€.
κ°μ²΄ νμ μ λμΈ
리ν°λ΄ νμ
μ΄λ μμ νμ
κ³Ό λ§μ°¬κ°μ§λ‘ λͺ¨λ κ°μ²΄ νμ
μ μ‘΄μ¬νμ§ μλ μμ±μ μ κ·ΌνκΈ° μν΄μλ νμ
μ μ’νμΌ νλ€.(νμ
κ°λ
)
const person = Math.random() > 0.5
? {name: 'j', age: 123}
: {name: 'l', phoneNumber: 10}
person.name // κ°λ₯
person.age // λΆκ°λ₯(person.ageκ° number | undefinedμ΄κΈ° λλ¬Έμ΄λ€.)
person.phoneNumber // λΆκ°λ₯(person.phoneNumberκ° number | undefinedμ΄κΈ° λλ¬Έμ΄λ€.)
κ°μ²΄ νμ λ΄λ‘μ
if ('age' in person) {
person.age; // κ°λ₯
} else {
person.phoneNumber // κ°λ₯
}
---
// μλμ κ°μ΄ μ¬μ©νμ§ μλλ€λ κ±° κΈ°μ΅νκΈ°!!!
if (person.age) {
person.age;
} else {
person.phoneNumber
}
κ΅μ°¨ νμ
type A = {name: string, age: number};
type B = {name: string, phoneNumber: number};
type C = A & B;
// {name: string, age: number, phoneNumber: number}
Never νμ
let t: string & number;
// t: nerver => λΆκ°λ₯ν νμ
(μ‘΄μ¬ν μ μλ νμ
)
// κ±°μ μ¬μ©νμ§ μμ§λ§, λΆκ°λ₯ν μνλ₯Ό λνλ΄κΈ° μν΄ κ°λμ© λ±μ₯νλ€.
λλ£λ€ λ΄μ© μ 리 λ° μΆκ°
- μμ