← λͺ©λ‘μœΌλ‘œ
Advanced Required type

Required type μ΄λž€?

전달 받은 νŒŒλΌλ―Έν„°μ—μ„œ μ˜΅μ…”λ„ 값을 λ””ν΄νŠΈ κ°’μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 것이 일반적 μž…λ‹ˆλ‹€.
μ΄λ•Œ λ””ν΄νŠΈ 값은 개발자 μ˜ν•΄ λͺ…μ‹œλ˜μ§€λ§Œ νƒ€μž…μ€ μ—¬μ „νžˆ μ˜΅μ…”λ„ 처리 λ˜μ–΄ μžˆμ–΄
νƒ€μž…μ΄ λ³€κ²½λ˜κ±°λ‚˜ μΆ”κ°€ λ λ•Œ λ””ν΄νŠΈ 값을 μ œλŒ€λ‘œ λ°˜μ˜ν•˜μ§€ λͺ» ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ λ””ν΄νŠΈ κ°’μ˜ νƒ€μž…μ€ νŒŒλΌλ―Έν„° νƒ€μž…μ˜ λͺ¨λ“  속성을 Required μ²˜λ¦¬ν•˜μ—¬ λ§Œλ“€μ–΄ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œλ“€μ–΄ 보기

이미 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ‚΄μž₯ νƒ€μž…μœΌλ‘œ Required νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ Requried νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œλ§Œ Required 처리 ν•©λ‹ˆλ‹€.
이 문제λ₯Ό ν•΄κ²°ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ λͺ¨λ“  νƒ€μž…μ— λŒ€ν•΄ μž¬κ·€μ μœΌλ‘œ Required 처리 ν•  수 μžˆλŠ” νƒ€μž…μ„ λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.

// μ•„λž˜ λ‚΄μž₯ νƒ€μž…λ“€μ€ Required 처리λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (μΆ©λΆ„νžˆ 더 쑴재 ν•  수 있으며 상황에 따라 μΆ”κ°€ν•©λ‹ˆλ‹€.)
type ExcludeType = Element | Window | NodeList | HTMLCollection;

// 1. object μ΄μ™Έμ˜ 프리미티 값인 경우 ν•΄λ‹Ή 값을 λ°˜ν™˜
// 2. ExcludeType νƒ€μž…μ— μ†ν•˜λ©΄ μ›λž˜ νƒ€μž…μ„ κ·ΈλŒ€λ‘œ λ°˜ν™˜
// 3. 자기 μžμ‹ μ˜ νƒ€μž…μ„ λ‹€μ‹œ λ°˜ν™˜ν•˜μ—¬ μž¬κ·€μ μœΌλ‘œ μˆ˜ν–‰
type RequiredParams<T> = T extends object
  ? {
      [K in keyof T]-?: T[K] extends infer U
        ? U extends ExcludeType
          ? U
          : RequiredParams<U>
        : T[K];
    }
  : T;

κ²°κ³Ό

interface Params {
  name?: {
    last?: string;
    first: string;
  };
}

type Requried = RequiredParams<Params>;
const result: Required = {
  // last 속성이 μ—†μœΌλ―€λ‘œ 컴파일 μ—λŸ¬ λ°œμƒ
  name: {
    first: 'first',
  },
};

μœ„μ™€ 같이 μ‚¬μš© ν•  경우 Requried νƒ€μž…μ€ name, last 속성에 μ˜΅μ…”λ„μ΄ μ‚­μ œλœ μƒνƒœλ‘œ νƒ€μž…μ΄ μΆ”λ‘ λ©λ‹ˆλ‹€.
νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό 컴파일 νƒ€μž„μ— μΆ”λ‘  κ°€λŠ₯ν•˜λ„λ‘ ν•˜μ—¬
μ†ŒμŠ€ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 높이고 예츑 κ°€λŠ₯ν•œ μ½”λ“œλ‘œ λ§Œλ“œλŠ”λ° μžˆμœΌλ―€λ‘œ 이런 μœ ν‹Έ νƒ€μž…μ„ μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λ©΄
μ œν’ˆμ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.