TypeScript theorytheory 0/50 · 0%
Foundations · medium

37. Error handling patterns

Typed errors and Result-style alternatives to exceptions.

`catch` clauses type their parameter as `unknown` (under `useUnknownInCatchVariables`, the default in strict mode), since JavaScript allows throwing any value, not just `Error` instances.

ts
try {
  riskyCall();
} catch (err) {
  if (err instanceof Error) {
    console.log(err.message);
  } else {
    console.log("Unknown error", err);
  }
}

An alternative to exceptions is a `Result` type that makes success/failure explicit in the return type, forcing callers to handle both cases instead of possibly forgetting a `try/catch`.

ts
type Result<T> = { ok: true; value: T } | { ok: false; error: string };

function parseAmount(input: string): Result<number> {
  const n = Number(input);
  return Number.isNaN(n) ? { ok: false, error: "not a number" } : { ok: true, value: n };
}

Check your understanding

  1. 1. What type is a `catch` clause's parameter under strict mode by default?

  2. 2. Why check `err instanceof Error` before accessing `err.message`?

  3. 3. What advantage does a `Result<T>` return type have over throwing?