Tipos condicionales e infer en TypeScript
Un if a nivel de tipos, y la palabra clave que extrae un tipo de una posición.
type Unwrap<T> = T extends Promise<infer Inner> ? Inner : T;
type ElementOf<T> = T extends readonly (infer Item)[] ? Item : never;
type FirstArg<F> = F extends (first: infer A, ...rest: never[]) => unknown
? A
: never;
type A = Unwrap<Promise<string>>;
type B = ElementOf<number[]>;
type C = FirstArg<(name: string, age: number) => void>;
type Flatten<T> = T extends readonly (infer Item)[] ? Flatten<Item> : T;
type Deep = Flatten<number[][][]>;
const a: A = "unwrapped";
const b: B = 42;
const c: C = "first";
const deep: Deep = 1;
console.log(a, b, c, deep);
Cómo funciona
A extends B ? X : Yelige a nivel de tipos.infernombra un tipo en la posición donde aparece.- Así están escritos ReturnType y Awaited.
Palabras clave y builtins usados aquí
ABCDeepPromiseTconstextendsinfernevernumberreadonlystringtype
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 564
- Tokens
- 181
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 103 segundos.
Paso 2 de 3 en Tipos condicionales; paso 2 de 12 en Programación a nivel de tipos.