Volver a Tipos Avanzados
Ir al examen del modulo
Tipos Avanzados — Leccion 6
·15 minLa 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...