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

seoyoon_leeΒ·2026λ…„ 4μ›” 1일

TypeScript

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

πŸ“Œ 1. 쑰건뢀 νƒ€μž… (Conditional Type)

βœ… 핡심 κ°œλ…

πŸ‘‰ β€œνƒ€μž…μœΌλ‘œ ifλ¬Έ μ“°λŠ” 것”

type A = number extends string ? string : number;

πŸ‘‰ 해석:

  • numberκ°€ string이냐?
  • ❌ μ•„λ‹ˆλ‹ˆκΉŒ β†’ number

πŸ”₯ μ‰¬μš΄ μ˜ˆμ‹œ

type IsString<T> = T extends string ? "YES" : "NO";

type A = IsString<string>; // "YES"
type B = IsString<number>; // "NO"

πŸ‘‰ κ·Έλƒ₯ μ΄λ ‡κ²Œ 생각해:

"Tκ°€ string이면 YES, μ•„λ‹ˆλ©΄ NO"

πŸ“Œ 2. κ°μ²΄μ—μ„œ extends 의미

type ObjA = { a: number };
type ObjB = { a: number; b: number };

type B = ObjB extends ObjA ? number : string;

βœ… 핡심

πŸ‘‰ 속성이 더 많으면 β€œν™•μž₯된 것”

  • ObjBλŠ” ObjA의 λͺ¨λ“  κ±Έ 포함함 β†’ βœ… true

πŸ‘‰ κ²°κ³Ό: number

πŸ’‘ μ‰½κ²Œ 이해

// λΆ€λͺ¨
{ a: number }

// μžμ‹
{ a: number, b: number }

πŸ‘‰ μžμ‹μ€ λΆ€λͺ¨λ₯Ό 포함함 β†’ extends κ°€λŠ₯

πŸ“Œ 3. μ œλ„€λ¦­ + 쑰건뢀 νƒ€μž…

type StringNumberSwitch<T> = T extends number ? string : number;

βœ… 의미

  • number β†’ string
  • λ‚˜λ¨Έμ§€ β†’ number

πŸ”₯ μ˜ˆμ‹œ

type A = StringNumberSwitch<number>; // string
type B = StringNumberSwitch<string>; // number

πŸ“Œ 4. ⭐⭐⭐ 뢄산적 쑰건뢀 νƒ€μž… (μ€‘μš”)

type StringNumberSwitch<T> = T extends number ? string : number;


type C = StringNumberSwitch<number | string>;

πŸ‘‰ λ‚΄λΆ€ λ™μž‘

μžλ™μœΌλ‘œ μͺΌκ°œμ§:

StringNumberSwitch<number>  β†’ string
StringNumberSwitch<string> β†’ number

πŸ‘‰ κ²°κ³Ό:

string | number

πŸ”₯ 핡심 ν•œ 쀄
πŸ‘‰ μœ λ‹ˆμ˜¨ νƒ€μž…μ΄λ©΄ μžλ™μœΌλ‘œ ν•˜λ‚˜μ”© 검사함

❗뢄산 막기

type StringNumberSwitch = [T] extends [number] ? string : number;

πŸ‘‰ μ΄λ ‡κ²Œ ν•˜λ©΄ μͺΌκ°œμ§€μ§€ μ•ŠμŒ

πŸ“Œ 5. Exclude / Extract (싀무 핡심πŸ”₯)

βœ… Exclude (제거)

type A = Exclude<number | string | boolean, string>;

πŸ‘‰ string 제거

πŸ‘‰ κ²°κ³Ό:

number | boolean

βœ… Extract (μΆ”μΆœ)

type B = Extract<number | string | boolean, string>;

πŸ‘‰ string만 남김

πŸ‘‰ κ²°κ³Ό:

string

πŸ’‘ ν•œ 쀄 정리

νƒ€μž…μ˜λ―Έ
ExcludeλΉΌκΈ°
Extract뽑기

πŸ“Œ 6. infer (πŸ”₯ 핡심 쀑 핡심)

πŸ‘‰ νƒ€μž… μ•ˆμ—μ„œ 값을 β€œμΆ”λ‘ β€ν•΄μ„œ κΊΌλ‚΄λŠ” 것

βœ… ν•¨μˆ˜ λ°˜ν™˜κ°’ κΊΌλ‚΄κΈ°

type ReturnType = T extends () => infer R ? R : never;

πŸ‘‰ 해석:

  • ν•¨μˆ˜λ©΄ β†’ return νƒ€μž… 꺼냄
  • μ•„λ‹ˆλ©΄ β†’ never

πŸ”₯ μ˜ˆμ‹œ

type FuncA = () => string;
type A = ReturnType<FuncA>; // string

❗ 이건 μ™œ never?

type C = ReturnType<number>;

πŸ‘‰ numberλŠ” ν•¨μˆ˜κ°€ μ•„λ‹˜ β†’ ❌ β†’ never

never

πŸ“Œ 7. Promise κ°’ κΊΌλ‚΄κΈ°

type PromiseUnpack<T> = T extends Promise<infer R> ? R : never;

πŸ”₯ μ˜ˆμ‹œ

type A = PromiseUnpack<Promise<number>>; // number
type B = PromiseUnpack<Promise<string>>; // string

πŸ’‘ μ‰½κ²Œ 이해

Promise β†’ number만 꺼냄

✨ 전체 핡심 μš”μ•½ (μ§„μ§œ μ€‘μš”)

πŸ‘‰ 1. 쑰건뢀 νƒ€μž… = νƒ€μž… ifλ¬Έ
πŸ‘‰ 2. extends = 포함 관계
πŸ‘‰ 3. μœ λ‹ˆμ˜¨ = μžλ™ 뢄해됨 (λΆ„μ‚°)
πŸ‘‰ 4. infer = νƒ€μž… μ•ˆμ—μ„œ κ°’ κΊΌλ‚΄κΈ°

🧠 κ°€μž₯ 많이 ν•˜λŠ” μ‹€μˆ˜

❌ 1. extends = μƒμ†μ΄λΌκ³ λ§Œ 생각
πŸ‘‰ ❌ μ•„λ‹˜ β†’ "포함 관계"μž„

❌ 2. μœ λ‹ˆμ˜¨μ΄λ©΄ ν•œ 번만 κ²€μ‚¬ν•œλ‹€κ³  생각
πŸ‘‰ ❌ β†’ μžλ™μœΌλ‘œ μͺΌκ°œμ§

❌ 3. infer μ•„λ¬΄λ°λ‚˜ μ“Έ 수 μžˆλ‹€κ³  생각
πŸ‘‰ ❌ β†’ λ°˜λ“œμ‹œ 쑰건뢀 νƒ€μž… μ•ˆμ—μ„œλ§Œ κ°€λŠ₯

🎯 μ§„μ§œ μ‰¬μš΄ λΉ„μœ 

  • 쑰건뢀 νƒ€μž… β†’ νƒ€μž…μš© ifλ¬Έ
  • extends β†’ ν¬ν•¨λ˜λƒ?
  • infer β†’ μ•ˆμ—μ„œ κΊΌλ‚΄μ˜€κΈ°
  • Exclude β†’ λΉΌκΈ°
  • Extract β†’ 필터링
profile
Frontend Developer · 기둝 ⭐

0개의 λŒ“κΈ€