Pattern Matching with Discriminated Unions
123456789101112131415161718type Shape = | { kind: "circle"; radius: number } | { kind: "square"; side: number } | { kind: "rectangle"; width: number; height: number }; function area(shape: Shape): number { switch (shape.kind) { case "circle": // Only a circle has a radius property return Math.PI * shape.radius * shape.radius; case "square": // Only a square has a side property return shape.side * shape.side; case "rectangle": // Only a rectangle has width and height properties return shape.width * shape.height; } }
When working with discriminated unions, you often need to write logic that depends on the specific variant of the union you are handling. By using the discriminant propertyβin this example, "kind"βyou can pattern match on each possible case. A switch statement is a natural fit for this purpose: it allows you to branch your logic based on the value of the discriminant, and, crucially, gives you safe access to properties that exist only on a particular variant.
Thanks for your feedback!
Ask AI
Ask AI
Ask anything or try one of the suggested questions to begin our chat
Can you explain what a discriminated union is in TypeScript?
How does the switch statement ensure type safety in this example?
Can you show how to add another shape to this union?
Awesome!
Completion rate improved to 5.88
Pattern Matching with Discriminated Unions
Swipe to show menu
123456789101112131415161718type Shape = | { kind: "circle"; radius: number } | { kind: "square"; side: number } | { kind: "rectangle"; width: number; height: number }; function area(shape: Shape): number { switch (shape.kind) { case "circle": // Only a circle has a radius property return Math.PI * shape.radius * shape.radius; case "square": // Only a square has a side property return shape.side * shape.side; case "rectangle": // Only a rectangle has width and height properties return shape.width * shape.height; } }
When working with discriminated unions, you often need to write logic that depends on the specific variant of the union you are handling. By using the discriminant propertyβin this example, "kind"βyou can pattern match on each possible case. A switch statement is a natural fit for this purpose: it allows you to branch your logic based on the value of the discriminant, and, crucially, gives you safe access to properties that exist only on a particular variant.
Thanks for your feedback!