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
}
}