Copying a large finished block before understanding the first change.
Better approach: Type one small slice, run it, and explain the evidence before adding the next slice.
Here’s the simple reason this matters: `never` represents a state that should be impossible. Exhaustiveness checks use it to make the compiler warn when a new union variant is not handled. In this course, we connect it directly to the contracts that make TaskFlow code safer before it reaches runtime, so you can see where the idea lives in a real project instead of memorizing a definition.
≈ 1,910 structured instructional words
`never` represents a state that should be impossible. Exhaustiveness checks use it to make the compiler warn when a new union variant is not handled.
You will use this idea while working on the contracts that make TaskFlow code safer before it reaches runtime. We keep the example small first, then connect it back to TaskFlow so the framework does not hide the underlying behavior.
Start with the plain-English idea. `never` represents a state that should be impossible. Exhaustiveness checks use it to make the compiler warn when a new union variant is not handled.
Now place it in TaskFlow. This lesson belongs to the contracts that make TaskFlow code safer before it reaches runtime. Ask four questions while you work: what enters this boundary, who owns the decision, what dependency does it use, and what evidence proves the result?
Keep the change small. Predict what you should see before you run anything, then compare the prediction with the real terminal, browser, HTTP, database, test, container, or CI evidence. If they differ, debug the first mismatch instead of editing several places at random.
The goal is not to remember the exact snippet below. The goal is to be able to explain never and Exhaustiveness in your own words, rebuild the core behavior, and adapt it when the requirement changes.
You are working inside the TypeScript — From JavaScript to Safe Contracts track. The project is healthy before this lesson, and the learner has completed the preceding checkpoint.
Open the project root in VS Code and a terminal.
Confirm you are on the intended Git branch and have no unrelated uncommitted changes.
Run the previous checkpoint verification before changing code.
Keep browser DevTools, API client, database console, or Docker logs visible when they are relevant to the boundary.
State the requirement for never and Exhaustiveness in one observable sentence. Avoid implementation words at first; describe what a user, caller, compiler, database, or deployment should observe.
Confirm the baseline is healthy. Run the narrowest existing verification and record the result so a new failure can be attributed to this lesson rather than an earlier problem.
Inspect the current boundary relevant to never and Exhaustiveness. Identify the input, owner, dependency, output, and failure mode before adding code.
Read the working example below without running it. Predict the exact output, HTTP status, compiler result, database state, UI state, or deployment evidence.
Type the smallest working slice yourself. Do not paste a finished subsystem. Keep the diff small enough that every new line can be explained.
Run the narrowest command or interaction that proves the slice. Compare the observed evidence with the prediction and write down any mismatch.
Extend the slice one step toward TaskFlow. Preserve the same ownership rule while replacing toy data with the real project boundary used by never and Exhaustiveness.
Introduce the controlled failure described below. Capture the first useful error line, request/response, query plan, browser state, test failure, container log, or CI job evidence before editing anything.
Locate the first boundary where expected and actual evidence diverge. Change only the root cause, then rerun exactly the same verification.
Add a repeatable regression check when practical: a test, type assertion, SQL constraint, health check, CI gate, security test, or documented smoke-test step.
Close the lesson and rebuild the core behavior from memory. If you cannot explain one step, reopen only that section rather than copying the whole solution.
type Status = "OPEN" | "DONE";
function statusLabel(status: Status) {
switch (status) {
case "OPEN": return "Open";
case "DONE": return "Done";
default: { const impossible: never = status; return impossible; }
}
}If a new Status variant is added later, the `never` assignment becomes a compile-time warning that the switch is incomplete.
Break the exact assumption this lesson depends on. For **never and Exhaustiveness**, change one input, configuration, ordering rule, permission, state transition, or dependency so the example can no longer satisfy its contract. Before running it, write down the failure you expect. Then run the same verification, capture the first useful symptom, and repair only the root cause.
| Symptom | What to inspect |
|---|---|
| Nothing changes or the wrong code path runs. | Confirm the exact file/route/process is active, then inspect the closest boundary input before changing implementation. |
| The output differs from the prediction. | Compare expected and actual evidence in order: input → boundary → dependency → output. Stop at the first mismatch. |
| A downstream error hides the real cause. | Move one boundary earlier. Check compiler diagnostics, request payload, framework registration, SQL state, container logs, or CI step output before the final symptom. |
| The fix works only once. | Add a deterministic verification and reset state between runs. Look for hidden cache, environment, transaction, time, ordering, or shared-state dependencies. |
Better approach: Type one small slice, run it, and explain the evidence before adding the next slice.
Better approach: Find the first boundary where expected and actual evidence differ, then change only that cause.
Better approach: Explain why never and Exhaustiveness belongs in this boundary and what would go wrong if the same rule were duplicated elsewhere.
Better approach: Deliberately violate one assumption and confirm the failure is understandable and controlled.
Reproduce the never and Exhaustiveness example exactly and explain each line before moving on.
Change one TaskFlow requirement while preserving the ownership rule demonstrated by never and Exhaustiveness.
Reproduce the intentional never and Exhaustiveness failure, capture evidence, and repair only the root cause.
Implement a new TaskFlow variation of never and Exhaustiveness without reopening the working example until your first attempt fails.
Explain why the chosen boundary for never and Exhaustiveness is preferable to placing the same rule in an adjacent layer.
Answer: `never` represents a state that should be impossible. Exhaustiveness checks use it to make the compiler warn when a new union variant is not handled.
A good never and Exhaustiveness explanation describes the behavior or boundary, not only the API or syntax used to implement it.
Answer: If a new Status variant is added later, the `never` assignment becomes a compile-time warning that the switch is incomplete.
That evidence is the observable contract for the never and Exhaustiveness example. Compare it with the real result before changing anything.
Answer: You will use this idea while working on the contracts that make TaskFlow code safer before it reaches runtime. We keep the example small first, then connect it back to TaskFlow so the framework does not hide the underlying behavior.
The course connects never and Exhaustiveness to a real project boundary so ownership and failure modes are easier to remember.
Answer: Capture the first useful symptom, compare actual evidence with the prediction, and identify the earliest boundary where they diverge.
For never and Exhaustiveness, evidence-first debugging prevents random edits and keeps the investigation tied to the actual failure path.
Answer: You can rebuild the core idea behind never and Exhaustiveness, change one requirement, diagnose a broken version, and explain why the responsibility lives where you placed it.
Transfer and diagnosis are stronger evidence of never and Exhaustiveness understanding than copy-paste success.
In production, never and Exhaustiveness must have an observable failure mode. Decide what should be logged, measured, tested, constrained, or surfaced without leaking sensitive data.
Prefer explicit contracts over conventions that only one developer understands. The next engineer should be able to locate the owner of this behavior from the project structure and tests.
Do not add abstraction merely because the course mentions it. Introduce additional layers only when they isolate a real volatility, boundary, policy, or testability problem.
Your completion state is stored only in this browser.