Discriminated Unions
Exhaustive pattern matching
type Result<T> =
| { ok: true; value: T }
| { ok: false; error: string };
function divide(a: number, b: number): Result<number> {
if (b === 0) return { ok: false, error: "Division by zero" };
return { ok: true, value: a / b };
}
function display(result: Result<number>) {
if (result.ok) {
console.log("Result:", result.value);
} else {
console.error("Error:", result.error);
}
}
display(divide(10, 3));
display(divide(10, 0));
// State machine with exhaustiveness
type State =
| { status: "idle" }
| { status: "loading" }
| { status: "success"; data: string[] }
| { status: "error"; message: string };
function render(state: State): string {
switch (state.status) {
case "idle": return "Press start";
case "loading": return "Loading...";
case "success": return `Got ${state.data.length} items`;
case "error": return `Oops: ${state.message}`;
default: {
const _exhaustive: never = state;
return _exhaustive;
}
}
}
console.log(render({ status: "loading" }));
console.log(render({ status: "success", data: ["a", "b", "c"] }));