
π βνμ μΌλ‘ ifλ¬Έ μ°λ κ²β
type A = number extends string ? string : number;
π ν΄μ:
type IsString<T> = T extends string ? "YES" : "NO";
type A = IsString<string>; // "YES"
type B = IsString<number>; // "NO"
π κ·Έλ₯ μ΄λ κ² μκ°ν΄:
"Tκ° stringμ΄λ©΄ YES, μλλ©΄ NO"
type ObjA = { a: number };
type ObjB = { a: number; b: number };
type B = ObjB extends ObjA ? number : string;
π μμ±μ΄ λ λ§μΌλ©΄ βνμ₯λ κ²β
π κ²°κ³Ό: number
π‘ μ½κ² μ΄ν΄
// λΆλͺ¨
{ a: number }
// μμ
{ a: number, b: number }
π μμμ λΆλͺ¨λ₯Ό ν¬ν¨ν¨ β extends κ°λ₯
type StringNumberSwitch<T> = T extends number ? string : number;
π₯ μμ
type A = StringNumberSwitch<number>; // string
type B = StringNumberSwitch<string>; // number
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;
π μ΄λ κ² νλ©΄ μͺΌκ°μ§μ§ μμ
type A = Exclude<number | string | boolean, string>;
π string μ κ±°
π κ²°κ³Ό:
number | boolean
type B = Extract<number | string | boolean, string>;
π stringλ§ λ¨κΉ
π κ²°κ³Ό:
string
| νμ | μλ―Έ |
|---|---|
| Exclude | λΉΌκΈ° |
| Extract | λ½κΈ° |
π νμ μμμ κ°μ βμΆλ‘ βν΄μ κΊΌλ΄λ κ²
type ReturnType = T extends () => infer R ? R : never;
π ν΄μ:
π₯ μμ
type FuncA = () => string;
type A = ReturnType<FuncA>; // string
β μ΄κ±΄ μ never?
type C = ReturnType<number>;
π numberλ ν¨μκ° μλ β β β never
never
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 μ무λ°λ μΈ μ μλ€κ³ μκ°
π β β λ°λμ μ‘°κ±΄λΆ νμ
μμμλ§ κ°λ₯