μ λ¬ λ°μ νλΌλ―Έν°μμ μ΅μ
λ κ°μ λν΄νΈ κ°μΌλ‘ μ²λ¦¬νλ κ²μ΄ μΌλ°μ μ
λλ€.
μ΄λ λν΄νΈ κ°μ κ°λ°μ μν΄ λͺ
μλμ§λ§ νμ
μ μ¬μ ν μ΅μ
λ μ²λ¦¬ λμ΄ μμ΄
νμ
μ΄ λ³κ²½λκ±°λ μΆκ° λ λ λν΄νΈ κ°μ μ λλ‘ λ°μνμ§ λͺ» ν μλ μμ΅λλ€.
κ·Έλμ λν΄νΈ κ°μ νμ
μ νλΌλ―Έν° νμ
μ λͺ¨λ μμ±μ 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 μμ±μ μ΅μ
λμ΄ μμ λ μνλ‘ νμ
μ΄ μΆλ‘ λ©λλ€.
νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ λͺ©μ μ λ°νμ μλ¬λ₯Ό μ»΄νμΌ νμμ μΆλ‘ κ°λ₯νλλ‘ νμ¬
μμ€ μ½λμ μμ μ±μ λμ΄κ³ μμΈ‘ κ°λ₯ν μ½λλ‘ λ§λλλ° μμΌλ―λ‘ μ΄λ° μ νΈ νμ
μ μ μ νκ² μ¬μ©νλ©΄
μ νμ μμ μ±μ λμΌ μ μμ΅λλ€.