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
- Asignar el sobrante a
neverfalla cuando se agrega un caso. - Un helper vuelve legible el mensaje de error.
- Un Record sobre la unión es la alternativa guiada por tabla.
Palabras clave y builtins usados aquí
EventJSONObjectRecordcaseconstfunctionnevernumberreturnstringswitchthrowtype
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.
Paso 2 de 3 en Exhaustividad y pruebas; paso 10 de 12 en Programación a nivel de tipos.