TypeScript

Exhaustive `assertNever`

admin by @admin ADMIN
2d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Compile-time guarantee that every variant of a union is handled. When you add a new variant later, every switch missing that case becomes a type error. The runtime version is a safety net.
TypeScript
Raw
export function assertNever(x: never): never {
  throw new Error(
    `Unhandled discriminant: ${typeof x === 'object' ? JSON.stringify(x) : String(x)}`
  );
}

type Shape =
  | { kind: 'circle';    radius: number }
  | { kind: 'square';    size: number }
  | { kind: 'rectangle'; w: number; h: number };

function area(s: Shape): number {
  switch (s.kind) {
    case 'circle':    return Math.PI * s.radius ** 2;
    case 'square':    return s.size * s.size;
    case 'rectangle': return s.w * s.h;
    default:          return assertNever(s);   // catches new variants
  }
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.