CAP 03 · LEC 02·Control de flujo
switch: múltiples ramas sin anidamiento
switch es la alternativa legible a una cadena larga de else if cuando comparas un solo valor contra múltiples opciones fijas.
¿Encontraste un error o algo que mejorar?Editá esta lección en GitHub →
Sintaxis básica
const dia = "lunes";
switch (dia) {
case "lunes":
console.log("Inicio de semana");
break;
case "viernes":
console.log("¡Por fin viernes!");
break;
case "sábado":
case "domingo":
console.log("Fin de semana");
break;
default:
console.log("Entre semana");
}type Dia = "lunes" | "martes" | "miércoles" | "jueves" | "viernes" | "sábado" | "domingo";
function describeDia(dia: Dia): string {
switch (dia) {
case "sábado":
case "domingo":
return "Fin de semana";
case "viernes":
return "¡Por fin viernes!";
default:
return "Entre semana";
}
}Salida
Inicio de semanaEl break es obligatorio
Sin break, el código continúa ejecutando los casos siguientes (fall-through). Esto es un bug en el 99% de los casos. Siempre añade break o usa return dentro de una función.
switch vs if / else if
| switch | if / else if | |
|---|---|---|
| Cuándo usarlo | Valor exacto contra lista fija de opciones | Condiciones complejas, rangos, múltiples variables |
| Legibilidad | Muy limpio con muchas opciones | Se anida con muchas ramas |
| Expresividad | Solo igualdad estricta | Cualquier expresión |
| TypeScript exhaustivo | Puede detectar casos no manejados | Más difícil de hacer exhaustivo |
Switch exhaustivo en TypeScript
TypeScript puede garantizar que hayas manejado todos los casos de un tipo union usando never:
type Forma = "círculo" | "rectángulo" | "triángulo";
function calcularArea(forma: Forma, ...args: number[]): number {
switch (forma) {
case "círculo":
return Math.PI * args[0] ** 2;
case "rectángulo":
return args[0] * args[1];
case "triángulo":
return (args[0] * args[1]) / 2;
default: {
const _exhaustive: never = forma;
// Si añades un nuevo tipo a Forma sin manejar aquí,
// TypeScript muestra un error en _exhaustive
throw new Error(`Forma no manejada: ${_exhaustive}`);
}
}
}