πŸ“ κΈ°μˆ μ±… μŠ€ν„°λ””

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 => λΆˆκ°€λŠ₯ν•œ νƒ€μž…(μ‘΄μž¬ν•  수 μ—†λŠ” νƒ€μž…)
// 거의 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ, λΆˆκ°€λŠ₯ν•œ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 가끔씩 λ“±μž₯ν•œλ‹€.

λ™λ£Œλ“€ λ‚΄μš© 정리 및 μΆ”κ°€

  • μ˜ˆμ •

μ°Έκ³