Dos utilidades pequeñas para replicar el patrón Result en TypeScript

Fuentes: Two Tiny Utils for the Result Pattern

Tras años programando en Rust, muchos desarrolladores han adoptado el tipo Result<T, E> como alternativa al tradicional try/catch: en lugar de lanzar y capturar excepciones, las funciones devuelven explícitamente un valor etiquetado como Ok(valor) o Err(error), lo que obliga al compilador y a quien llama a tratar ambos casos. El operador ? permite además propagar errores de forma concisa por la pila de llamadas.

En TypeScript no existe ese lenguaje integrado, pero se puede conseguir un comportamiento equivalente definiendo un tipo unión como { status: "success"; result: T } | { status: "error"; err: unknown }. Este enfoque es similar al de la crate anyhow en Rust: sacrifica precisión sobre el tipo de error a cambio de simplicidad, algo razonable en JavaScript, donde cualquier punto del programa puede fallar.

El artículo propone un patrón de tres capas: una capa de presentación que solo consume Result y nunca usa try/catch, una capa de servicios que captura todas las excepciones y devuelve siempre Result, y una capa núcleo que interactúa con APIs, bases de datos o ficheros y deja que los errores se propaguen. Para evitar el ruido repetitivo de envolver cada promesa en try/catch, el autor presenta dos utilidades. La primera, tryCatch, ejecuta una función que devuelve una promesa y empaqueta el valor o el error en un Result. La segunda, safeExec, garantiza que una función que ya devuelve Result no rompa esa promesa: si todo va bien reenvía el resultado; si por algún motivo lanza, lo transforma en un Result de error.

Ambas funciones son pequeñas, genéricas y reutilizables en front-end, back-end o herramientas CLI, y el autor las presenta como parte del utilero personal que lleva consigo en cada proyecto, más por hábito y ergonomía que por necesidad académica.