πŸ“˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ κ°œλ… 정리05

seoyoon_leeΒ·2026λ…„ 3μ›” 29일

TypeScript

λͺ©λ‘ 보기
12/21
post-thumbnail

πŸ“Œ νƒ€μž… 쒁히기(Type Narrowing)

1️⃣ νƒ€μž… μ’νžˆκΈ°λž€?

νƒ€μž… 쒁히기(Type Narrowing) λŠ”
μ—¬λŸ¬ νƒ€μž…μ΄ μ„žμ—¬ μžˆλŠ” κ°’(μœ λ‹ˆμ˜¨ νƒ€μž…)을
πŸ‘‰ 쑰건문을 톡해 더 ꡬ체적인 νƒ€μž…μœΌλ‘œ μ€„μ΄λŠ” 것

let value: string | number;

이 μƒνƒœμ—μ„œλŠ” μ–΄λ–€ νƒ€μž…μΈμ§€ λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ—
πŸ‘‰ λ°”λ‘œ λ©”μ„œλ“œ μ‚¬μš© λΆˆκ°€λŠ₯

value.toUpperCase(); ❌ (string인지 ν™•μ‹  λͺ»ν•¨)

κ·Έλž˜μ„œ 쑰건문으둜 νƒ€μž…μ„ β€œμ’ν˜€μ•Όβ€ ν•œλ‹€.

2️⃣ μ™œ ν•„μš”ν•œκ°€?

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ•ˆμ „ν•˜κ²Œ μ½”λ“œ 싀행을 도와쀀닀.

πŸ‘‰ ν™•μ‹€ν•˜μ§€ μ•Šμ€ νƒ€μž…μ€ μ‚¬μš© λͺ»ν•˜κ²Œ λ§‰λŠ”λ‹€
πŸ‘‰ κ·Έλž˜μ„œ μš°λ¦¬κ°€ 직접 νƒ€μž…μ„ ν™•μΈν•΄μ€˜μ•Ό ν•œλ‹€

3️⃣ κΈ°λ³Έ 예제

type Person = {
  name: string;
  age: number;
};

function func(value: number | string | Date | null | Person) {
  if (typeof value === 'number') {
    console.log(value.toFixed());
  } else if (typeof value === 'string') {
    console.log(value.toUpperCase());
  } else if (value instanceof Date) {
    console.log(value.getTime());
  } else if (value && 'age' in value) {
    console.log(`${value.name}은 ${value.age}μ‚΄ μž…λ‹ˆλ‹€`);
  }
}

4️⃣ νƒ€μž… μ’νžˆλŠ” 방법 4κ°€μ§€ πŸ”₯

βœ… 1. typeof (κΈ°λ³Έ νƒ€μž… 체크)

typeof value === 'number'
typeof value === 'string'

πŸ‘‰ μ‚¬μš© κ°€λŠ₯ νƒ€μž…

  • string
  • number
  • boolean
  • undefined
  • symbol

πŸ‘‰ νŠΉμ§•
κ°€μž₯ 기본적인 방법

βœ… 2. instanceof (객체 νƒ€μž… 체크)

value instanceof Date

πŸ‘‰ 의미
πŸ‘‰ "valueκ°€ Date둜 λ§Œλ“  객체냐?"

βœ” true β†’ Date νƒ€μž… ν™•μ •
βœ” false β†’ μ•„λ‹˜

πŸ‘‰ μ‚¬μš© 예

  • Date
  • Error
  • class 객체

βœ… 3. in μ—°μ‚°μž (속성 쑴재 μ—¬λΆ€)

'age' in value

πŸ‘‰ 의미
πŸ‘‰ "value μ•ˆμ— ageλΌλŠ” 속성이 μžˆλƒ?"

βœ” 있으면 β†’ Person νƒ€μž…μœΌλ‘œ μΆ”λ‘ 

⚠️ μ€‘μš” 포인트

value && 'age' in value

πŸ‘‰ μ™œ value && λΆ™μΌκΉŒ?

πŸ‘‰ 이유:
valueκ°€ null이면 μ—λŸ¬ λ°œμƒν•˜κΈ° λ•Œλ¬Έ

null.age ❌ μ—λŸ¬

κ·Έλž˜μ„œ λ°˜λ“œμ‹œ λ¨Όμ € 체크

βœ… 4. null 체크 (싀무)

if (value !== null)

λ˜λŠ”

if (value)

πŸ‘‰ null / undefined λ°©μ§€μš©

5️⃣ νƒ€μž…κ°€λ“œ(Type Guard)λž€?

πŸ‘‰ 쑰건문을 톡해 νŠΉμ • νƒ€μž…λ§Œ ν†΅κ³Όμ‹œν‚€λŠ” 것

if (typeof value === 'number') {
  // μ—¬κΈ° μ•ˆμ—μ„œλŠ” 무쑰건 number
}

πŸ‘‰ 즉
πŸ‘‰ "이 νƒ€μž…λ§Œ λ“€μ–΄μ˜€κ²Œ λ§‰λŠ” ν•„ν„°"

6️⃣ κ°€μž₯ 많이 ν‹€λ¦¬λŠ” λΆ€λΆ„ 🚨

❌ μ‹€μˆ˜ 1

typeof value === 'object'

πŸ‘‰ 문제점
πŸ‘‰ null도 object둜 νŒλ‹¨λ¨

typeof null === 'object' // true 😱

πŸ‘‰ ν•΄κ²°

value && typeof value === 'object'

❌ μ‹€μˆ˜ 2

value instanceof Person ❌

πŸ‘‰ 이유
Person은 "νƒ€μž…"이지 "κ°’"이 μ•„λ‹˜

πŸ‘‰ ν•΄κ²°

'age' in value

❌ μ‹€μˆ˜ 3

value.toUpperCase();

πŸ‘‰ μœ λ‹ˆμ˜¨ μƒνƒœμ—μ„œ λ°”λ‘œ μ‚¬μš© ❌
πŸ‘‰ λ°˜λ“œμ‹œ νƒ€μž… 쒁히기 ν•„μš”

7️⃣ ν•œ 쀄 핡심 μš”μ•½ πŸ”₯

πŸ‘‰ νƒ€μž… 쒁히기 = 쑰건문으둜 νƒ€μž… ν™•μ •ν•˜κΈ°

8️⃣ 싀무 λŠλ‚Œ 예제

function print(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase());
  } else {
    console.log(value.toFixed(2));
  }
}

9️⃣ μ§„μ§œ 핡심 νŒ¨ν„΄ ⭐

typeof value === 'string'
value instanceof Date
value && 'key' in value

πŸ‘‰ 이 3개만 κΈ°μ–΅ν•˜λ©΄ 80% ν•΄κ²° κ°€λŠ₯

πŸ”Ÿ 마무리

νƒ€μž… μ’νžˆκΈ°λŠ”
πŸ‘‰ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ μ•ˆμ „ν•˜κ²Œ μ½”λ“œ μ§œλŠ” 핡심 기술

profile
Frontend Developer · 기둝 ⭐

0개의 λŒ“κΈ€