typestar

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

  1. A extends B ? X : Y elige a nivel de tipos.
  2. infer nombra un tipo en la posición donde aparece.
  3. Así están escritos ReturnType y Awaited.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Tipos condicionales; paso 2 de 12 en Programación a nivel de tipos.

← Anterior Siguiente →