Catch unhandled cases at compile time

function assertNever(value: never): never {
  throw new Error(`Unhandled value: ${value}`);
}
 
type Shape = 'circle' | 'square';
 
function area(shape: Shape) {
  switch (shape) {
    case 'circle': return /* ... */;
    case 'square': return /* ... */;
    default: return assertNever(shape); // compile error if a case is missing
  }
}