Bird
Raised Fist0
Typescriptprogramming~10 mins

Never type and unreachable code in Typescript - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Never type and unreachable code
Start function
↓
Check all cases
↓
If no return or throw
↓
Return never type or unreachable
↓
End function
The function checks all cases: either returns a value or calls a never-returning function that throws an error, so code after is unreachable.
Execution Sample
Typescript
function fail(message: string): never {
  throw new Error(message);
}

function example(x: number | string) {
  if (typeof x === 'number') return x;
  fail('Not a number');
}
This code shows a function that never returns normally (throws error) and how unreachable code is handled.
Execution Table
StepCode LineActionEvaluationResult
1function example called with x=42Check type of xtypeof 42 === 'number'true
2if branch takenReturn xreturn 4242
3function example called with x='hello'Check type of xtypeof 'hello' === 'number'false
4else branchCall fail('Not a number')throw new Error('Not a number')Exception thrown
5Code after fail callUnreachableNo executionnever reached
💡 Execution stops either by returning a value or throwing an error (never returns).
Variable Tracker
VariableStartAfter 1After 2After 3Final
xundefined4242'hello''hello'
return valuenone4242nonenone (throws)
Key Moments - 2 Insights
Why is the code after the fail() call unreachable?
Because fail() throws an error and never returns, so the program stops there. See execution_table row 5 where code after fail() is never executed.
What does the never type mean in TypeScript?
It means the function never returns normally, either it throws or loops forever. In the example, fail() has return type never because it always throws (execution_table row 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the result when example(42) is called?
A42
BException thrown
Cundefined
Dnever
💡 Hint
Check execution_table row 2 where example returns 42.
At which step does the function throw an error?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
See execution_table row 4 where fail() throws an error.
If fail() did not throw an error, what would happen to the code after it?
AThe function would return never type
BIt would still be unreachable
CIt would be reachable and executed
DThe function would throw an error anyway
💡 Hint
Refer to key_moments about unreachable code after fail() call.
Concept Snapshot
Never type means a function never returns normally (throws or loops forever).
Code after a never-returning call is unreachable.
TypeScript uses never type to catch unreachable code.
Example: function fail() throws error and returns never.
Functions handling all cases can use never to signal no normal return.
Full Transcript
This example shows how TypeScript's never type works. The function fail() throws an error and never returns normally. When example() calls fail(), the code after fail() is unreachable. The execution table traces calls with x as number or string. When x is number, example returns it. When x is string, fail() throws an error, stopping execution. The never type helps TypeScript know that code after fail() won't run. This prevents unreachable code bugs and helps with type safety.

Practice

(1/5)
1. What does the never type represent in TypeScript?
easy
A. A variable that can hold any type of value.
B. A type that represents optional values.
C. A function that returns null or undefined.
D. A function that never returns normally, like one that always throws an error or loops forever.

Solution

  1. Step 1: Understand the never type meaning

    The never type is used for functions or expressions that never complete normally, such as those that throw errors or run infinite loops.
  2. Step 2: Compare with other types

    Other options describe common types like any, null, or optional, which are different from never.
  3. Final Answer:

    A function that never returns normally, like one that always throws an error or loops forever. -> Option D
  4. Quick Check:

    never means no normal return [OK]
Hint: Never means function never finishes normally [OK]
Common Mistakes:
  • Confusing never with void or any
  • Thinking never means optional or nullable
  • Assuming never is a value type
2. Which of the following is the correct syntax for a function that returns never in TypeScript?
easy
A. function fail(): never { throw new Error('Fail'); }
B. function fail(): void { return; }
C. function fail(): never { return null; }
D. function fail(): string { throw new Error('Fail'); }

Solution

  1. Step 1: Check function return type and body

    A function returning never must not return normally. Throwing an error fits this.
  2. Step 2: Validate each option

    function fail(): never { throw new Error('Fail'); } throws an error, so it never returns normally. function fail(): void { return; } returns void normally. function fail(): never { return null; } tries to return null, which is invalid for never. function fail(): string { throw new Error('Fail'); } returns string but throws, so return type mismatches.
  3. Final Answer:

    function fail(): never { throw new Error('Fail'); } -> Option A
  4. Quick Check:

    Throw error matches never return [OK]
Hint: Throw error to return never type correctly [OK]
Common Mistakes:
  • Returning a value in a never function
  • Using void instead of never
  • Returning null or undefined in never
3. What will be the output of this TypeScript code?
function check(value: string | number) {
  switch (typeof value) {
    case 'string':
      return 'string';
    case 'number':
      return 'number';
    default:
      const _exhaustiveCheck: never = value;
      return _exhaustiveCheck;
  }
}
console.log(check(42));
medium
A. 'string'
B. 'number'
C. Compilation error due to unreachable code
D. Runtime error

Solution

  1. Step 1: Analyze the switch cases

    The function handles 'string' and 'number' types explicitly, so the default case is unreachable for these inputs.
  2. Step 2: Check the call and output

    Calling check(42) matches the 'number' case, so it returns 'number'. The default case with never is never reached.
  3. Final Answer:

    'number' -> Option B
  4. Quick Check:

    Handled all cases, returns 'number' [OK]
Hint: Check switch covers all types, default never runs [OK]
Common Mistakes:
  • Thinking default case runs for known types
  • Confusing never with runtime errors
  • Expecting compilation error for unreachable default
4. Identify the error in this TypeScript code snippet:
function assertNever(x: never): never {
  throw new Error('Unexpected value: ' + x);
}

function process(value: string | number) {
  if (typeof value === 'string') {
    return 'string';
  } else if (typeof value === 'number') {
    return 'number';
  } else {
    return assertNever(value);
  }
}
medium
A. Error because assertNever should return void not never.
B. Error because assertNever is called with a non-never type.
C. No error; code is correct and safe.
D. Error because value can never be string | number.

Solution

  1. Step 1: Understand the function purpose

    assertNever is used to catch unexpected values at compile time by requiring a never type.
  2. Step 2: Analyze the process function

    All possible types string and number are handled. The else branch is unreachable, so value is never there, making the call valid.
  3. Final Answer:

    No error; code is correct and safe. -> Option C
  4. Quick Check:

    Unreachable else means value is never [OK]
Hint: Else unreachable means value is never type [OK]
Common Mistakes:
  • Thinking assertNever is called with string or number
  • Confusing never return with void
  • Assuming else branch always runs
5. Given this TypeScript code, what is the best way to ensure all cases are handled and catch missing cases at compile time?
type Shape = { kind: 'circle', radius: number } | { kind: 'square', size: number };

function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2;
    // Missing case for 'square'
  }
}
hard
A. Add a default case that calls a function accepting never to catch unhandled cases.
B. Ignore missing cases; TypeScript will warn automatically.
C. Add a default case that returns 0 without checks.
D. Use any type for shape to avoid errors.

Solution

  1. Step 1: Identify missing case problem

    The 'square' case is missing, so the switch is not exhaustive.
  2. Step 2: Use never type to catch missing cases

    Adding a default case that calls a function requiring never forces TypeScript to check exhaustiveness and report missing cases.
  3. Final Answer:

    Add a default case that calls a function accepting never to catch unhandled cases. -> Option A
  4. Quick Check:

    Use never in default to enforce exhaustiveness [OK]
Hint: Use default with never to catch missing cases [OK]
Common Mistakes:
  • Assuming TypeScript warns without default never
  • Returning default values silently
  • Using any to bypass type safety
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard