Volver al código TypeScript

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.

TypeScript
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í

  1. Result es una unión discriminada: el campo ok le dice a TypeScript cuál de las dos formas tiene delante.
  2. 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.
  3. La función nunca lanza: todo lo que puede salir mal está en el tipo de retorno.
  4. El redondeo a dos decimales evita arrastrar 149.89999 a una factura.
Cómo probarlo

Guardalo como monto.ts y corré: npx tsx monto.ts. Probá cambiar la entrada por "abc" o "-5".

Ojo con esto

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.

El prompt
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.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.