API reference › @evolu/common › Result › trySync
Call Signature
function trySync<T>(fn: () => T): Result<T, unknown>;
Defined in: packages/common/src/Result.ts:618
Wraps a synchronous function that may throw, returning a Result.
When provided, mapError converts the caught unknown value into a typed
domain error.
Some APIs throw for both recoverable and unrecoverable errors. In that case,
convert only the errors the caller can recover from and rethrow the rest. The
trySync error mapper propagates rethrown values instead of converting them
to Err.
Example
import {
assert,
assertErr,
assertEqual,
assertOk,
assertType,
trySync,
type Result,
type Typed,
} from "@evolu/common";
class LegacySeatUnavailableError extends Error {}
const legacyReserveSeat = (seat: string): void => {
if (seat === "A1") throw new LegacySeatUnavailableError();
if (seat === "B1") throw new Error("Database error");
};
const reserveSeat = (seat: string): Result<void, SeatUnavailableError> =>
trySync(
() => legacyReserveSeat(seat),
(error) => {
if (error instanceof LegacySeatUnavailableError) {
return { type: "SeatUnavailable", seat };
}
throw error;
},
);
interface SeatUnavailableError extends Typed<"SeatUnavailable"> {
readonly seat: string;
}
const result = reserveSeat("B2");
assertType<Result<void, SeatUnavailableError>, typeof result>();
assertOk(result, undefined);
assertErr(reserveSeat("A1"), { type: "SeatUnavailable", seat: "A1" });
const databaseError = trySync(() => reserveSeat("B1"));
assertErr(databaseError);
assert(databaseError.error instanceof Error, "Expected an Error.");
assertEqual(databaseError.error.message, "Database error");
Call Signature
function trySync<T, E>(
fn: () => T,
mapError: (error: unknown) => E,
): Result<T, E>;
Defined in: packages/common/src/Result.ts:621
Maps caught exceptions to a typed error.