aboutsummaryrefslogtreecommitdiff
path: root/utils/assert/assert-never.ts
diff options
context:
space:
mode:
Diffstat (limited to 'utils/assert/assert-never.ts')
-rw-r--r--utils/assert/assert-never.ts16
1 files changed, 16 insertions, 0 deletions
diff --git a/utils/assert/assert-never.ts b/utils/assert/assert-never.ts
new file mode 100644
index 0000000..406eca9
--- /dev/null
+++ b/utils/assert/assert-never.ts
@@ -0,0 +1,16 @@
+/**
+ * Mark a branch as unreachable in an exhaustive switch. If the compiler
+ * ever allows this line to be reached, `value` stops being `never` and
+ * the call site fails to type-check — making exhaustive checks load-bearing
+ * at compile time.
+ *
+ * Usage:
+ * switch (kind) {
+ * case 'a': ...
+ * case 'b': ...
+ * default: assertNever(kind)
+ * }
+ */
+export function assertNever(value: never, message?: string): never {
+ throw new Error(message ?? `Unhandled case: ${String(value)}`)
+}