Bird
Raised Fist0
Typescriptprogramming~5 mins

Type narrowing with typeof in Typescript

Choose your learning style10 modes available
Introduction

Type narrowing helps your program understand what kind of value it is working with. Using typeof lets you check the type and write safer code.

When you want to do different things based on whether a value is a number or a string.
When you receive input that could be many types and need to handle each type correctly.
When you want to avoid errors by making sure you only use methods that exist on the value's type.
Syntax
Typescript
if (typeof variable === 'typeName') {
  // code for this type
}

The typeof operator returns a string like 'string', 'number', 'boolean', 'object', or 'undefined'.

Use triple equals === to compare the result of typeof for accuracy.

Examples
This checks if value is a string, then safely calls a string method.
Typescript
if (typeof value === 'string') {
  console.log(value.toUpperCase());
}
This checks if input is a number, then adds 10 to it.
Typescript
if (typeof input === 'number') {
  console.log(input + 10);
}
This checks if data is a boolean, then prints 'Yes' or 'No'.
Typescript
if (typeof data === 'boolean') {
  console.log(data ? 'Yes' : 'No');
}
Sample Program

This program uses typeof to check the type of value. It then does something different for strings, numbers, and booleans.

Typescript
function printValue(value: string | number | boolean) {
  if (typeof value === 'string') {
    console.log(`String: ${value.toUpperCase()}`);
  } else if (typeof value === 'number') {
    console.log(`Number: ${value + 100}`);
  } else if (typeof value === 'boolean') {
    console.log(`Boolean: ${value ? 'True' : 'False'}`);
  } else {
    console.log('Unknown type');
  }
}

printValue('hello');
printValue(42);
printValue(false);
OutputSuccess
Important Notes

Type narrowing with typeof only works with primitive types like string, number, boolean, undefined, and symbol.

For objects or arrays, you need other ways to narrow types, like instanceof or custom checks.

Summary

Type narrowing helps your code know exactly what type it is working with.

Use typeof to check simple types like string, number, and boolean.

This makes your code safer and easier to understand.

Practice

(1/5)
1. What does the typeof operator do in TypeScript?
easy
A. It converts a variable to a string.
B. It changes the type of a variable.
C. It declares a new type.
D. It checks the type of a variable at runtime.

Solution

  1. Step 1: Understand the purpose of typeof

    The typeof operator is used to check the type of a variable during the program's execution (runtime).
  2. Step 2: Differentiate from other options

    It does not change, declare, or convert types; it only inspects the type.
  3. Final Answer:

    It checks the type of a variable at runtime. -> Option D
  4. Quick Check:

    typeof checks type at runtime [OK]
Hint: Remember: typeof tells you the type, it doesn't change it. [OK]
Common Mistakes:
  • Thinking typeof changes the variable's type
  • Confusing typeof with type declaration
  • Assuming typeof converts values to strings
2. Which of the following is the correct syntax to narrow a variable value to a string using typeof?
easy
A. if (typeof value === 'string') { }
B. if (typeof value = 'string') { }
C. if (typeof value == string) { }
D. if (typeof value === string) { }

Solution

  1. Step 1: Check correct equality operator and string literal

    The correct way to compare is using triple equals === and the type name as a string literal, like 'string'.
  2. Step 2: Identify syntax errors in other options

    if (typeof value = 'string') { } uses single equals which is assignment, not comparison. Options A and C miss quotes around 'string'.
  3. Final Answer:

    if (typeof value === 'string') { } -> Option A
  4. Quick Check:

    Use === and quotes for typeof checks [OK]
Hint: Use === and quotes around type names in typeof checks. [OK]
Common Mistakes:
  • Using single = instead of ===
  • Forgetting quotes around type names
  • Using == instead of ===
3. What will be the output of this TypeScript code?
function checkType(x: string | number) {
  if (typeof x === 'string') {
    return x.toUpperCase();
  } else {
    return x + 10;
  }
}

console.log(checkType('hello'));
console.log(checkType(5));
medium
A. HELLO and 510
B. hello and 15
C. HELLO and 15
D. Error at runtime

Solution

  1. Step 1: Analyze the input 'hello'

    Since 'hello' is a string, typeof x === 'string' is true, so x.toUpperCase() returns 'HELLO'.
  2. Step 2: Analyze the input 5

    Since 5 is a number, the else block runs, returning 5 + 10 = 15.
  3. Final Answer:

    HELLO and 15 -> Option C
  4. Quick Check:

    String upper + number addition = HELLO, 15 [OK]
Hint: Check typeof to pick string or number logic correctly. [OK]
Common Mistakes:
  • Concatenating number and string instead of adding
  • Calling string methods on numbers
  • Confusing toUpperCase output
4. Identify the error in this TypeScript code using typeof for type narrowing:
function process(value: string | boolean) {
  if (typeof value === 'boolean') {
    return value.toUpperCase();
  } else {
    return value ? 'Yes' : 'No';
  }
}
medium
A. Calling toUpperCase on a boolean value
B. Using typeof with boolean type
C. Missing return type annotation
D. Incorrect if-else structure

Solution

  1. Step 1: Check the type narrowing condition

    The condition typeof value === 'boolean' correctly narrows value to boolean.
  2. Step 2: Identify method call on wrong type

    Inside this block, calling value.toUpperCase() is invalid because booleans do not have this method.
  3. Final Answer:

    Calling toUpperCase on a boolean value -> Option A
  4. Quick Check:

    Boolean has no toUpperCase method [OK]
Hint: Check method calls match the narrowed type. [OK]
Common Mistakes:
  • Assuming booleans have string methods
  • Ignoring type narrowing effect
  • Confusing boolean and string logic
5. You have a function that accepts input: string | number | boolean. You want to return:
- The length of the string if input is a string,
- The number multiplied by 2 if input is a number,
- The string 'True' or 'False' if input is a boolean.

Which of the following implementations correctly uses typeof for type narrowing?
hard
A. function handle(input: string | number | boolean) { if (typeof input === 'boolean') { return input.length; } else if (typeof input === 'string') { return input * 2; } else { return input ? 'True' : 'False'; } }
B. function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.length; } else if (typeof input === 'number') { return input * 2; } else { return input ? 'True' : 'False'; } }
C. function handle(input: string | number | boolean) { if (typeof input === 'number') { return input.length; } else if (typeof input === 'boolean') { return input * 2; } else { return input ? 'True' : 'False'; } }
D. function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.toUpperCase(); } else if (typeof input === 'number') { return input + 2; } else { return input ? 'True' : 'False'; } }

Solution

  1. Step 1: Check string handling

    function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.length; } else if (typeof input === 'number') { return input * 2; } else { return input ? 'True' : 'False'; } } returns input.length for strings, which is correct. function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.toUpperCase(); } else if (typeof input === 'number') { return input + 2; } else { return input ? 'True' : 'False'; } } returns input.toUpperCase(), which is not requested.
  2. Step 2: Check number handling

    function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.length; } else if (typeof input === 'number') { return input * 2; } else { return input ? 'True' : 'False'; } } multiplies number by 2, as required. function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.toUpperCase(); } else if (typeof input === 'number') { return input + 2; } else { return input ? 'True' : 'False'; } } adds 2, which is incorrect. Options B and C misuse length or multiplication on wrong types.
  3. Step 3: Check boolean handling

    function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.length; } else if (typeof input === 'number') { return input * 2; } else { return input ? 'True' : 'False'; } } returns 'True' or 'False' strings correctly. Others mix up boolean logic or return wrong types.
  4. Final Answer:

    function handle(input: string | number | boolean) { if (typeof input === 'string') { return input.length; } else if (typeof input === 'number') { return input * 2; } else { return input ? 'True' : 'False'; } } -> Option B
  5. Quick Check:

    Match typeof checks with correct operations [OK]
Hint: Match each typeof check with correct operation for that type. [OK]
Common Mistakes:
  • Calling string methods on numbers or booleans
  • Using length on numbers or booleans
  • Mixing up operations for each type
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