🥇 Type Manipulation, Inferencia en Conditional Types

Los tipos condicionales nos proporcionan una forma de inferir los tipos con los que realizamos comparaciones, estos se obtienen en la parte verdadera utilizando la palabra infer. Para los ejemplos anterior pudimos simplificar mas aun, utilizando infer en lugar de obtener el tipo mediante un indexed type.

type Flatten<T> = T extends Array<infer I> ? I : T;

type T1 = Flatten<number[]>;
// type = number

type T2 = Flatten<number>;
// type = number

Esto también puede ser escrito mediante la sintaxis compacta de los arreglos [infer I];

type Flatten2<T> = T extends [infer I] ? I : T;

type T3 = Flatten2<string[]>
// type = string

type T4 = Flatten2<string>
// type = string

En ambos ejemplos hemos utilizado la palabra infer para introducir un nuevo generic llamado I. Esto nos simplifica la obtención del tipo que el arreglo almacena.

type ObtenerSalida<T> = T extends () => infer Return ? Return : never;

type T1 = ObtenerSalida<() => string>;
// type = string


type T2 = ObtenerSalida<() => () => number>;
// type () => number