@saez-juan/result
v1.1.0
Published
Pequena utilidad para modelar resultados de operaciones con el patron "error-as-values", inspirada en `Result` de Rust. Evita excepciones para el flujo normal y hace explicito el manejo de errores.
Readme
@saez-juan/result
Pequena utilidad para modelar resultados de operaciones con el patron "error-as-values", inspirada en Result de Rust. Evita excepciones para el flujo normal y hace explicito el manejo de errores.
Instalacion
bun add @saez-juan/resultIdea principal
En vez de lanzar excepciones, las funciones retornan un objeto Result que puede ser:
ok(data): operacion exitosa condata.err({ code, message?, details? }): operacion fallida con informacion del error.
Uso basico
import Result from "@saez-juan/result";
function divide(a: number, b: number) {
if (b === 0)
return Result.err({
code: "DIV_BY_ZERO",
message: "Cannot divide by zero"
});
return Result.ok(a / b);
}
const r = divide(6, 3);
if (r.isOk) {
console.log("result:", r.value);
} else {
console.error("error:", r.error);
}API
Tipos exportados:
ResultError:{ code: string; message?: string; details?: unknown }SyncResult<T>: alias deResult<T> | ErrorResultAsyncResult<T>: alias dePromise<Result<T> | ErrorResult>ErrorResult: alias deResult<null>
Clase Result<T>:
- Propiedades de solo lectura:
isOk: boolean-- indica exitoisErr: boolean-- indica errorvalue: NonNullable<T>-- datos cuandoisOkestrueerror: ResultError-- error cuandoisErrestrueasError: ErrorResult-- mismo objeto, tipado comoResult<null>, limpiadata
- Metodos estaticos:
Result.ok<D>(data: D): Result<D>Result.err(err: ResultError): ErrorResult
- Metodos de instancia:
clear(scope?: "data" | "error" | "all"): void-- elimina campos internos para sanitizar respuestas
Nota: evita construir Result con new. Usa Result.ok y Result.err.
Ejemplos practicos
Manejo de errores temprano:
const res = await getUser();
if (res.isErr) return res.asError; // propaga error con tipo seguro
const user = res.value;Encadenado y sanitizacion:
const r = await createOrder(input);
if (r.isErr) return r.asError;
// Limpiar error antes de responder publicamente
r.clear("error");
return r; // solo contiene dataUso con AsyncResult:
import type { AsyncResult } from "@saez-juan/result";
async function getPrice(id: string): AsyncResult<number> {
try {
const price = await service.prices.get(id);
return Result.ok(price);
} catch (e) {
return Result.err({ code: "REMOTE_ERROR", details: e });
}
}Buenas practicas
- Valida
isOk/isErrantes de acceder avalue/error. - Usa
asErrorpara burbujear errores sin perder tipo. - Utiliza
clearpara removerdataoerroral construir respuestas externas.
Hecho por Juan Saez
