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.
Type narrowing with typeof in 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.
value is a string, then safely calls a string method.if (typeof value === 'string') { console.log(value.toUpperCase()); }
input is a number, then adds 10 to it.if (typeof input === 'number') { console.log(input + 10); }
data is a boolean, then prints 'Yes' or 'No'.if (typeof data === 'boolean') { console.log(data ? 'Yes' : 'No'); }
This program uses typeof to check the type of value. It then does something different for strings, numbers, and booleans.
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);
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.
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
typeof operator do in TypeScript?Solution
Step 1: Understand the purpose of
Thetypeoftypeofoperator is used to check the type of a variable during the program's execution (runtime).Step 2: Differentiate from other options
It does not change, declare, or convert types; it only inspects the type.Final Answer:
It checks the type of a variable at runtime. -> Option DQuick Check:
typeof checks type at runtime [OK]
- Thinking typeof changes the variable's type
- Confusing typeof with type declaration
- Assuming typeof converts values to strings
value to a string using typeof?Solution
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'.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'.Final Answer:
if (typeof value === 'string') { } -> Option AQuick Check:
Use === and quotes for typeof checks [OK]
- Using single = instead of ===
- Forgetting quotes around type names
- Using == instead of ===
function checkType(x: string | number) {
if (typeof x === 'string') {
return x.toUpperCase();
} else {
return x + 10;
}
}
console.log(checkType('hello'));
console.log(checkType(5));Solution
Step 1: Analyze the input 'hello'
Since 'hello' is a string,typeof x === 'string'is true, sox.toUpperCase()returns 'HELLO'.Step 2: Analyze the input 5
Since 5 is a number, the else block runs, returning 5 + 10 = 15.Final Answer:
HELLO and 15 -> Option CQuick Check:
String upper + number addition = HELLO, 15 [OK]
- Concatenating number and string instead of adding
- Calling string methods on numbers
- Confusing toUpperCase output
typeof for type narrowing:function process(value: string | boolean) {
if (typeof value === 'boolean') {
return value.toUpperCase();
} else {
return value ? 'Yes' : 'No';
}
}Solution
Step 1: Check the type narrowing condition
The conditiontypeof value === 'boolean'correctly narrows value to boolean.Step 2: Identify method call on wrong type
Inside this block, callingvalue.toUpperCase()is invalid because booleans do not have this method.Final Answer:
Calling toUpperCase on a boolean value -> Option AQuick Check:
Boolean has no toUpperCase method [OK]
- Assuming booleans have string methods
- Ignoring type narrowing effect
- Confusing boolean and string logic
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?Solution
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'; } } returnsinput.lengthfor 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'; } } returnsinput.toUpperCase(), which is not requested.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.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.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 BQuick Check:
Match typeof checks with correct operations [OK]
- Calling string methods on numbers or booleans
- Using length on numbers or booleans
- Mixing up operations for each type
Ready to prove it?
Pass the test and this pattern moves unknown
