Saltar al contenido principal
Curso/Tipos Avanzados/La palabra reservada infer
Volver a Tipos Avanzados

Tipos Avanzados — Leccion 6

·15 min

La palabra reservada infer

Extrae tipos dentro de tipos condicionales.

infer

infer permite extraer un tipo dentro de un tipo condicional.

typescript
type ExtraerRetorno<T> = T extends (...args: any[]) => infer R ? R : never;

type Fn = () => string;
type Retorno = ExtraerRetorno<Fn>; // string

Extraer tipo de promesa

typescript
type Awaited<T> = T extends Promise<infer U> ? U : T;

type A = Awaited<Promise<string>>;  // string
type B = Awaited<Promise<number>>;  // number
type C = Awaited<string>;           // string

Extraer tipo de array

typescript
type Elemento<T> = T extends (infer U)[] ? U : never;

type A = Elemento<string[]>;  // string
type B = Elemento<number[]>;  // number
type C = Elemento<(string | number)[]>; // string | number

Extraer tipo de tupla

typescript
type Primero<T> = T extends [infer First, ...any[]] ? First : never;
type Resto<T> = T extends [any, ...infer Rest] ? Rest : never;

type A = Primero<[1, 2, 3]>;  // 1
type B = Resto<[1, 2, 3]>;    // [2, 3]

Extraer propiedades

typescript
type ValorPropiedad<T, K extends keyof T> = T extends Record<K, infer V> ? V : never;

type Obj = { nombre: string; edad: number };
type TipoNombre = ValorPropiedad<Obj, "nombre">; // string

Ejemplo real: DeepPartial

typescript
type DeepPartial<T> = {
  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};

interface Config {
  api: {
    url: string;
    timeout: number;
  };
  debug: boolean;
}

type ConfigParcial = DeepPartial<Config>;
// { api?: { url?: string; timeout?: number }; debug?: boolean; }

Ejercicio pratico

Crea un type que extraiga el tipo de retorno de una función usando infer.

exercise.ts
Loading...
Resultado

Haz clic en "Ejecutar" para ver el resultado...

Ir al examen del modulo
Curso de TypeScript — Aprende desde cero