TypeScriptλ₯Ό μ¬μ©νλ€ λ³΄λ©΄ λμ± μ κ΅ν νμ
μμ€ν
μ νμμ±μ λλΌκ² λ©λλ€. νΉν, 볡μ‘ν μ λ€λ¦ νμ
μ λ€λ£° λλ μ‘°κ±΄λΆ νμ
(Conditional Types)κ³Ό ν¨κ» infer ν€μλκ° λ§€μ° μ μ©νκ² μ¬μ©λ μ μμ΅λλ€.
TypeScriptμ infer ν€μλκ° λ¬΄μμΈμ§, κ·Έλ¦¬κ³ μ΄λ»κ² νμ©ν μ μλμ§μ λν΄ μμλ³΄κ² μ΅λλ€.
inferλ TypeScriptμ μ‘°κ±΄λΆ νμ
μμ μ¬μ©λλ ν€μλλ‘, νΉμ νμ
μ μΌλΆλ₯Ό μΆλ‘ ν μ μλλ‘ λμμ€λλ€. μ½κ² λ§ν΄, inferλ μ λ€λ¦ νμ
μ λΆμνμ¬ μλ‘μ΄ νμ
μ μΆμΆνλ μν μ ν©λλ€.
λ¨Όμ , inferμ κΈ°λ³Έμ μΈ μ¬μ©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. μ¬κΈ°μλ ν¨μμ λ°ν νμ
μ μΆλ‘ νλ μμ λ₯Ό μ¬μ©ν©λλ€.
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
μ μ½λμμ GetReturnType νμ
μ μ λ€λ¦ Tκ° ν¨μ νμ
μΈ κ²½μ°, κ·Έ ν¨μμ λ°ν νμ
μ μΆλ‘ νμ¬ Rλ‘ μ€μ ν©λλ€. λ§μ½ ν¨μ νμ
μ΄ μλλΌλ©΄ neverλ₯Ό λ°νν©λλ€.
μ΄ νμ
μ μ¬μ©νλ©΄ νΉμ ν¨μμ λ°ν νμ
μ μλμΌλ‘ μΆλ‘ ν μ μμ΅λλ€.
μ΄μ infer ν€μλλ₯Ό μ€μ μμ μ΄λ»κ² νμ©ν μ μλμ§ λͺ κ°μ§ μμ λ₯Ό ν΅ν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
inferλ₯Ό μ¬μ©νλ©΄ ν¨μμ μΈμ νμ
μ μΆμΆν μ μμ΅λλ€.
type GetArguments<T> = T extends (...args: infer A) => any ? A : never;
type Args1 = GetArguments<(x: number, y: string) => void>; // [number, string]
type Args2 = GetArguments<() => void>; // []
μ΄ μ½λμμ GetArguments νμ μ μ£Όμ΄μ§ ν¨μμ μΈμ νμ μ λ°°μ΄λ‘ λ°νν©λλ€. μ΄λ₯Ό ν΅ν΄ ν¨μμ μΈμ νμ μ μ½κ² μΆμΆν μ μμ΅λλ€.
inferλ νλ‘λ―Έμ€ νμ
μ λ°ν κ°μ μΆλ‘ νλ λ°λ λ§€μ° μ μ©ν©λλ€.
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type Example1 = UnwrapPromise<Promise<string>>; // string
type Example2 = UnwrapPromise<number>; // number
UnwrapPromise νμ μ νλ‘λ―Έμ€μμ λ°νλλ μ€μ νμ μ μΆλ‘ ν©λλ€. νλ‘λ―Έμ€ νμ μ΄ μλ κ²½μ°μλ μλ νμ μ κ·Έλλ‘ λ°νν©λλ€.
λ°°μ΄ νμ
μμ μμμ νμ
μ μΆμΆνλ λ°©λ²λ inferλ‘ κ°λ¨νκ² κ΅¬νν μ μμ΅λλ€.
type ElementType<T> = T extends (infer U)[] ? U : T;
type Example1 = ElementType<string[]>; // string
type Example2 = ElementType<number[]>; // number
ElementType νμ μ λ°°μ΄μ μμ νμ μ λ°ννλ©°, λ°°μ΄μ΄ μλ νμ μ΄ μ£Όμ΄μ§ κ²½μ° κ·Έ νμ μ체λ₯Ό λ°νν©λλ€.
νν νμ
μμ 첫 λ²μ§Έ μμμ νμ
μ μΆμΆν λλ inferλ₯Ό μ¬μ©ν μ μμ΅λλ€.
type First<T> = T extends [infer U, ...any[]] ? U : never;
type Example1 = First<[string, number, boolean]>; // string
type Example2 = First<[boolean, number]>; // boolean
First νμ μ ννμ 첫 λ²μ§Έ μμ νμ μ μΆμΆνμ¬ μ μ©νκ² νμ©ν μ μμ΅λλ€.