// Created on savesnippets.com ยท https://savesnippets.com/Fi9Gzcf4DjzZGB 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 } }