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