type Err = { ok: false value: undefined error: string | Error } type Success = { ok: true value: T error: undefined } type Result = Err | Success export function isErr(result: Result): result is Err { return !result.ok } export function err(error: string | Error): Err { return { ok: false, value: undefined, error, } } export function ok(value: T): Success { return { ok: true, value, error: undefined, } } export async function tryCatch(promise: Promise): Promise> { try { const value = await promise return ok(value) } catch (error) { console.error(error) if (Error.isError(error)) { return err(error) } return err(String(error)) } }