Pulling this typescript pattern out of a larger project — might be useful on its own.
Lightweight Result discriminated union.
export type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E };
export const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
export const err = <E>(error: E): Result<never, E> => ({ ok: false, error });
export function unwrap<T, E>(r: Result<T, E>): T {
if (!r.ok) throw r.error;
return r.value;
}
Used it in production, works on my machine™.
Developer Discussions