Errores sin excepciones: el tipo Result
Un tipo de dos variantes que obliga al compilador a recordarte que la operación puede fallar.
El problema
Una función que lanza excepciones no lo dice en su firma: quien la llama se entera en producción. Con un Result, olvidarse de manejar el error no compila.
type Result<T, E = string> = { ok: true; valor: T } | { ok: false; error: E };
function parsearMonto(texto: string): Result<number> {
const n = Number(texto.replace(",", "."));
if (Number.isNaN(n)) return { ok: false, error: `"${texto}" no es un número` };
if (n < 0) return { ok: false, error: "el monto no puede ser negativo" };
return { ok: true, valor: Math.round(n * 100) / 100 };
}
const r = parsearMonto("149,90");
if (r.ok) {
console.log("Cobrar", r.valor.toFixed(2));
} else {
console.error("Rechazado:", r.error);
}
Por qué está escrito así
- Result es una unión discriminada: el campo ok le dice a TypeScript cuál de las dos formas tiene delante.
- Dentro del if (r.ok) el compilador sabe que existe r.valor; en el else, que existe r.error. Usar el campo equivocado no compila.
- La función nunca lanza: todo lo que puede salir mal está en el tipo de retorno.
- El redondeo a dos decimales evita arrastrar 149.89999 a una factura.
Guardalo como monto.ts y corré: npx tsx monto.ts. Probá cambiar la entrada por "abc" o "-5".
Result no reemplaza a las excepciones para lo inesperado (disco lleno, bug). Sirve para los fallos que son parte normal del negocio: un dato mal escrito, un saldo insuficiente.
Adaptalo a tu caso con IA
El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.
Uso este tipo Result en TypeScript. Escribime las funciones auxiliares map, andThen y unwrapOr para encadenar operaciones sin anidar if, y mostrame cómo quedaría validar este formulario con ellas: [CAMPOS Y REGLAS]. Mantené el tipado estricto, sin any, y sin librerías.
Ejemplo escrito y revisado a mano.
Comentarios
Todavía no hay comentarios. El primero puede ser el tuyo.
¿Lo adaptaste a algo tuyo?
Contame qué resolviste con esto, o qué le faltó.