typestar

Exhaustividad en TypeScript

El compilador demuestra que manejaste cada caso, si lo dejas.

type Event =
  | { kind: "start"; lang: string }
  | { kind: "finish"; tpm: number }
  | { kind: "abort"; reason: string };

function assertNever(value: never): never {
  throw new Error(`unhandled: ${JSON.stringify(value)}`);
}

function render(event: Event): string {
  switch (event.kind) {
    case "start":
      return `starting ${event.lang}`;
    case "finish":
      return `finished at ${event.tpm}`;
    case "abort":
      return `aborted: ${event.reason}`;
    default:
      return assertNever(event);
  }
}

const LABELS: Record<Event["kind"], string> = {
  start: "start",
  finish: "finish",
  abort: "abort",
};

console.log(render({ kind: "finish", tpm: 98 }), Object.keys(LABELS).length);

Cómo funciona

  1. Asignar el sobrante a never falla cuando se agrega un caso.
  2. Un helper vuelve legible el mensaje de error.
  3. Un Record sobre la unión es la alternativa guiada por tabla.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
29
Caracteres a escribir
650
Tokens
183
Ritmo de tres estrellas
110 tpm

Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 100 segundos.

Escribe este fragmento

Paso 2 de 3 en Exhaustividad y pruebas; paso 10 de 12 en Programación a nivel de tipos.

← Anterior Siguiente →