📖 Scenario: You are building a simple calculator that can add numbers or concatenate strings. To do this safely, you need to check the type of inputs before processing them.
🎯 Goal: Create a TypeScript program that uses typeof type guards to handle inputs differently based on whether they are numbers or strings.
📋 What You'll Learn
Create variables with different types (number and string)
Create a helper variable to hold the result
Use typeof type guards to check the type of inputs
Print the final result
💡 Why This Matters
🌍 Real World
Type guards help prevent errors when working with different data types, especially in user input or API data.
💼 Career
Understanding type guards is important for writing safe and reliable TypeScript code in web development and software engineering.
Progress0 / 4 steps
1
Create input variables
Create two variables called input1 and input2. Set input1 to the number 10 and input2 to the string "20".
Typescript
Hint
Use let to declare variables and assign the exact values given.
2
Create a result variable
Create a variable called result and set it to an empty string "".
Typescript
Hint
Initialize result as an empty string to store the final output.
3
Use typeof type guards to combine inputs
Use if statements with typeof to check if both input1 and input2 are numbers. If yes, add them and assign to result. Otherwise, convert both to strings and concatenate them, then assign to result.
Typescript
Hint
Use typeof to check types and handle both cases separately.
4
Print the result
Write a console.log statement to print the value of result.
Typescript
Hint
Use console.log(result) to show the final output.
Practice
(1/5)
1. What does the typeof operator do in TypeScript when used as a type guard?
easy
A. It declares a new variable with a specific type.
B. It converts a variable to a string type.
C. It checks the runtime type of a variable to narrow its type inside a condition.
D. It creates a new type alias for a variable.
Solution
Step 1: Understand the purpose of typeof
The typeof operator checks the actual type of a value at runtime, like 'string' or 'number'.
Step 2: Recognize its use as a type guard
Using typeof in an if condition helps TypeScript know the exact type inside that block, making code safer.
Final Answer:
It checks the runtime type of a variable to narrow its type inside a condition. -> Option C
Quick Check:
typeof narrows type [OK]
Hint: typeof checks actual type at runtime to narrow types [OK]
Common Mistakes:
Thinking typeof changes the variable's type
Confusing typeof with type declarations
Assuming typeof works at compile time only
2. Which of the following is the correct syntax to use typeof as a type guard in TypeScript?
easy
A. if (typeof x === 'string') { /* code */ }
B. if (typeof x = 'string') { /* code */ }
C. if (typeof x == string) { /* code */ }
D. if (typeof x === string) { /* code */ }
Solution
Step 1: Check the correct comparison operator
The strict equality operator === is required to compare typeof result with a string.
Step 2: Verify the string literal format
The type name must be a string literal like 'string', 'number', etc., inside quotes.
Final Answer:
if (typeof x === 'string') { /* code */ } -> Option A
Quick Check:
Correct typeof syntax uses === and quotes [OK]
Hint: Use === and quotes around type name in typeof checks [OK]
Common Mistakes:
Using single = instead of ===
Not putting type name in quotes
Using == instead of ===
3. What will be the output of this TypeScript code?
function checkValue(x: string | number) {
if (typeof x === 'string') {
return x.toUpperCase();
} else {
return x.toFixed(2);
}
}
console.log(checkValue(3.14159));
medium
A. '3.14'
B. '3.14' as a string
C. '3.14' as a number
D. '3.14' as a string with two decimals
Solution
Step 1: Identify the type of input
The input is 3.14159, which is a number, so the else block runs.
Step 2: Understand the else block behavior
The else block calls toFixed(2) on the number, which returns a string with 2 decimals: '3.14'.
Final Answer:
'3.14' as a string with two decimals -> Option D
Quick Check:
Number input uses toFixed(2) = '3.14' [OK]
Hint: toFixed(2) returns string with 2 decimals [OK]
Common Mistakes:
Thinking toFixed returns a number
Confusing string and number outputs
Ignoring the else block
4. Find the error in this TypeScript code using typeof type guard:
function process(value: string | boolean) {
if (typeof value === 'boolean') {
return value.toUpperCase();
} else {
return value;
}
}
medium
A. The typeof check should be for 'string' instead of 'boolean'.
B. Calling toUpperCase() on a boolean value causes an error.
C. The else block should convert value to boolean.
D. There is no error; the code is correct.
Solution
Step 1: Analyze the typeof condition
The condition checks if value is a boolean.
Step 2: Check method call on boolean
Inside the if block, it calls toUpperCase(), which exists only on strings, not booleans, causing an error.
Final Answer:
Calling toUpperCase() on a boolean value causes an error. -> Option B
Quick Check:
toUpperCase() invalid on boolean [OK]
Hint: Check method exists on type before calling [OK]
Common Mistakes:
Assuming booleans have string methods
Mixing up type guard conditions
Ignoring method compatibility
5. Given this function, what is the correct way to safely handle a variable that can be string, number, or boolean using typeof type guards?
function formatValue(val: string | number | boolean) {
// Fill in the blanks
}
hard
A. Use separate if blocks: if typeof val === 'string', else if 'number', else if 'boolean', then handle each accordingly.
B. Use a single if block checking if typeof val === 'string' and treat others as strings.
C. Convert val to string directly without typeof checks.
D. Use typeof val === 'object' to handle all types.
Solution
Step 1: Recognize multiple possible types
The variable can be string, number, or boolean, so each needs separate handling.
Step 2: Use multiple typeof checks
Use if-else if blocks checking typeof val === 'string', 'number', and 'boolean' to safely handle each type.
Final Answer:
Use separate if blocks: if typeof val === 'string', else if 'number', else if 'boolean', then handle each accordingly. -> Option A
Quick Check:
Multiple typeof checks for multiple types [OK]
Hint: Check each type separately with typeof for safety [OK]
Common Mistakes:
Handling all types as strings blindly
Using typeof 'object' for primitives
Skipping boolean type handling
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.