// Created on savesnippets.com ยท https://savesnippets.com/E1rH9QPga0aIPU type Ok = { ok: true; value: T }; type Err = { ok: false; error: E }; type Result = Ok | Err; const ok = (value: T): Ok => ({ ok: true, value }); const err = (error: E): Err => ({ ok: false, error }); function parseJson(s: string): Result { try { return ok(JSON.parse(s) as T); } catch (e) { return err(e as SyntaxError); } } const r = parseJson<{ name: string }>('{"name": "Alice"}'); if (r.ok) { console.log(r.value.name); // narrowed to Ok } else { console.error(r.error.message); // narrowed to Err }