Bird
Raised Fist0
Typescriptprogramming~10 mins

Control flow analysis behavior in Typescript - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Control flow analysis behavior
Start
↓
Check Condition
Yes| No↓
Execute Block
↓
Update State
↓
Repeat or Exit
Control flow analysis checks conditions and tracks variable states to decide which code runs next.
Execution Sample
Typescript
let x: number | undefined;
if (Math.random() > 0.5) {
  x = 10;
}
if (x !== undefined) {
  console.log(x + 5);
}
This code assigns x sometimes and then safely uses x only if it is defined.
Execution Table
StepActionConditionVariable StateOutput
1Declare xN/Ax = undefined
2Evaluate Math.random() > 0.5true or falsex = undefined
3If true, assign x = 10truex = 10
4If false, skip assignmentfalsex = undefined
5Check if x !== undefineddepends on xx = 10 or undefined
6If true, print x + 5truex = 1015
7If false, skip printfalsex = undefined
💡 Execution ends after checking and optionally printing based on x's value.
Variable Tracker
VariableStartAfter Step 3After Step 4Final
xundefined10undefined10 or undefined
Key Moments - 2 Insights
Why can we safely use x in console.log only after checking x !== undefined?
Because the execution_table shows that x might be undefined if the first condition is false, so checking ensures x has a number before using it.
What happens if we skip the check x !== undefined?
The program might try to add 5 to undefined, causing an error or unexpected output, as shown by the variable state in steps 4 and 7.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of x after step 3 if Math.random() > 0.5 is true?
Aundefined
B10
C5
Dnull
💡 Hint
Check the 'Variable State' column at step 3 in the execution_table.
At which step does the program decide not to print anything?
AStep 7
BStep 4
CStep 3
DStep 1
💡 Hint
Look at the 'Output' column in the execution_table for when output is empty after checking x.
If we remove the check 'x !== undefined', what problem might occur?
ANo problem, code runs fine
Bx will always be 10
Cx might be undefined causing an error when adding 5
DThe program will not compile
💡 Hint
Refer to key_moments explaining why the check is necessary.
Concept Snapshot
Control flow analysis tracks variable states through conditions.
It ensures variables are safe to use after checks.
Example: assign x conditionally, then use x only if defined.
This prevents runtime errors from undefined values.
Always check variables before use when types allow undefined.
Full Transcript
This example shows how TypeScript control flow analysis works. We start with a variable x that can be a number or undefined. The program randomly assigns 10 to x or leaves it undefined. Then it checks if x is not undefined before using it. This check is important because using x without it might cause errors. The execution table traces each step, showing variable states and actions. The variable tracker highlights how x changes. Key moments explain why the check matters. The quiz tests understanding of these steps. Control flow analysis helps write safer code by tracking variable states through conditions.

Practice

(1/5)
1.

What does TypeScript's control flow analysis primarily help with?

easy
A. Running the program faster by optimizing loops
B. Tracking variable types through code paths to catch errors early
C. Automatically fixing syntax errors in the code
D. Converting TypeScript code into JavaScript

Solution

  1. Step 1: Understand control flow analysis purpose

    Control flow analysis tracks how variables change types through different code paths.
  2. Step 2: Identify its main benefit

    This helps TypeScript catch type errors before running the program.
  3. Final Answer:

    Tracking variable types through code paths to catch errors early -> Option B
  4. Quick Check:

    Control flow analysis = type tracking [OK]
Hint: Control flow = tracking variable types in code paths [OK]
Common Mistakes:
  • Confusing control flow analysis with code execution speed
  • Thinking it fixes syntax errors automatically
  • Believing it compiles TypeScript to JavaScript
2.

Which of the following TypeScript code snippets correctly narrows a variable's type using control flow analysis?

let value: string | number = 5;
if (typeof value === 'string') {
  console.log(value.toUpperCase());
}
easy
A. The code should use instanceof instead of typeof
B. The code will cause a runtime error because value can be a number
C. The code needs a type assertion to call toUpperCase()
D. The code is correct and safe to call toUpperCase() inside the if block

Solution

  1. Step 1: Check the type guard condition

    The condition typeof value === 'string' narrows value to string inside the if block.
  2. Step 2: Confirm safe method call

    Since value is string here, calling toUpperCase() is safe and valid.
  3. Final Answer:

    The code is correct and safe to call toUpperCase() inside the if block -> Option D
  4. Quick Check:

    Type guard narrows type = safe method call [OK]
Hint: Use typeof checks to narrow union types safely [OK]
Common Mistakes:
  • Calling string methods without type narrowing
  • Confusing typeof with instanceof for primitives
  • Assuming type assertions are always needed
3.

What will be the output of this TypeScript code?

function checkValue(x: string | number) {
  if (typeof x === 'number') {
    return x.toFixed(2);
  } else {
    return x.toUpperCase();
  }
}
console.log(checkValue('hello'));
console.log(checkValue(3.14159));
medium
A. Runtime error because toFixed is not a function
B. "hello" and "3.14159"
C. "HELLO" and "3.14"
D. "HELLO" and "3.14159"

Solution

  1. Step 1: Analyze the first call with string

    For 'hello', the else block runs, returning 'HELLO' after toUpperCase().
  2. Step 2: Analyze the second call with number

    For 3.14159, the if block runs, returning '3.14' after toFixed(2).
  3. Final Answer:

    "HELLO" and "3.14" -> Option C
  4. Quick Check:

    Type guards produce correct string outputs [OK]
Hint: Check typeof to predict which block runs [OK]
Common Mistakes:
  • Assuming toFixed returns a number, not string
  • Ignoring type narrowing in if-else
  • Mixing up output formatting
4.

Identify the error in this TypeScript code related to control flow analysis:

function process(input: string | null) {
  if (input) {
    console.log(input.toLowerCase());
  } else {
    console.log(input.toLowerCase());
  }
}
medium
A. Calling toLowerCase() on null in the else block causes a runtime error
B. The if condition should be input !== null instead of input
C. TypeScript will automatically fix this error during compilation
D. There is no error; the code is safe

Solution

  1. Step 1: Check the else block usage

    In the else block, input is null, so calling toLowerCase() causes a runtime error.
  2. Step 2: Understand control flow limitation

    Control flow analysis narrows input in the if block but not in else, so unsafe call happens.
  3. Final Answer:

    Calling toLowerCase() on null in the else block causes a runtime error -> Option A
  4. Quick Check:

    Null check needed before method call [OK]
Hint: Else block may have null; avoid method calls there [OK]
Common Mistakes:
  • Assuming if(input) excludes null everywhere
  • Expecting TypeScript to fix runtime errors
  • Using loose null checks without safe calls
5.

Given this TypeScript code, what is the best way to fix the control flow analysis issue to avoid errors?

function formatInput(input: string | number | null) {
  if (typeof input === 'string') {
    return input.trim();
  } else if (typeof input === 'number') {
    return input.toFixed(1);
  }
  return input.trim();
}
hard
A. Add a null check before the last return to avoid calling trim() on null
B. Remove the last return statement because it's unreachable
C. Change all trim() calls to toString()
D. Use a type assertion to force input as string in the last return

Solution

  1. Step 1: Identify the problem with last return

    The last return input.trim() runs when input is null, causing an error.
  2. Step 2: Fix by adding null check

    Adding a check like if (input !== null) before calling trim() prevents errors.
  3. Final Answer:

    Add a null check before the last return to avoid calling trim() on null -> Option A
  4. Quick Check:

    Null checks prevent unsafe method calls [OK]
Hint: Always check for null before calling methods on unions [OK]
Common Mistakes:
  • Ignoring null possibility in union types
  • Assuming last return is unreachable
  • Using type assertions without 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