Last active
November 1, 2018 19:20
-
-
Save mochki/899a4032e73bfa10ecbfb6000c9b0ccf to your computer and use it in GitHub Desktop.
Exhaustiveness Checking in TypeScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is from Microsoft's presentation | |
type Shape = | |
| {kind: 'circle'; radius: number} | |
| {kind: 'rectangle'; w: number; h: number} | |
| {kind: 'sqaure'; size: number} | |
// This function will throw ts-errors if obj ever comes in as something other than error | |
function assertNever(obj: never) { | |
throw new Error('Unexpected object') | |
} | |
function getArea(shape: Shape) { | |
switch (shape.kind) { | |
case 'circle': | |
return Math.PI * shape.radius ** 2 | |
case 'rectangle': | |
return shape.w * shape.h | |
case 'sqaure': | |
return shape.size ** 2 | |
} | |
// For example, if one of the cases above was missing, shape would be infered as that type | |
// which would throw ts error | |
assertNever(shape) | |
} | |
const shape: Shape = {kind: 'circle', radius: 10} | |
const area = getArea(shape) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment