typestar

Condicionales distributivos en TypeScript

Un condicional sobre un parámetro de tipo desnudo corre una vez por miembro de la unión.

type Boxed<T> = T extends unknown ? { value: T } : never;
type NotBoxed<T> = [T] extends [unknown] ? { value: T } : never;

type Distributed = Boxed<string | number>;
type Together = NotBoxed<string | number>;

type MyExclude<T, U> = T extends U ? never : T;
type MyExtract<T, U> = T extends U ? T : never;
type MyNonNullable<T> = T extends null | undefined ? never : T;

type Levels = "debug" | "info" | "warn" | "error";
type Loud = MyExclude<Levels, "debug" | "info">;
type Quiet = MyExtract<Levels, "debug" | "info">;

const one: Distributed = { value: 1 };
const both: Together = { value: "either" };
const loud: Loud = "error";
const quiet: Quiet = "debug";
const defined: MyNonNullable<string | null> = "here";
console.log(one, both, loud, quiet, defined);

Cómo funciona

  1. La distribución es la razón de que Exclude y Extract funcionen.
  2. Envolver el parámetro en una tupla apaga la distribución.
  3. Es la regla más sorprendente de todo el sistema de tipos.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
20
Caracteres a escribir
763
Tokens
206
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 118 segundos.

Escribe este fragmento

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

← Anterior Siguiente →