TypeScript - Error Handling & Exhaustive Checks

Result types

type Ok = { ok: true; value: T };
type Err = { ok: false; error: string };

type Result = Ok | Err;

function parseIntSafe(s: string): Result {
  const n = Number.parseInt(s, 10);
  return Number.isNaN(n) ? { ok: false, error: 'NaN' } : { ok: true, value: n };
}

Exhaustive switches

type State = { kind: 'idle' } | { kind: 'loading' } | { kind: 'error'; message: string };

function render(s: State) {
  switch (s.kind) {
    case 'idle': return 'Idle';
    case 'loading': return 'Loading';
    case 'error': return s.message;
    default: const _x: never = s; return _x; // ensure exhaustive
  }
}