Equality narrowing is a feature where TypeScript uses equality checks (like === or !==) to narrow down the possible types of a variable within a code block.
Click to reveal answer
beginner
How does TypeScript narrow types after an if (x === null) check?
Inside the if block, TypeScript knows x is exactly null. Outside, it knows x is not null and narrows the type accordingly.
Click to reveal answer
beginner
Given <code>let value: string | number;</code> what happens after <code>if (typeof value === 'string')</code>?
Inside the if block, TypeScript narrows value to string. Outside, it narrows value to number.
Click to reveal answer
intermediate
Can equality narrowing work with custom types or only primitives?
Equality narrowing works with any types where equality checks make sense, including primitives like string, number, null, and also with literal types and enums.
Click to reveal answer
intermediate
What happens if you compare two variables of union types with === in TypeScript?
TypeScript narrows the types of both variables to the overlapping types that can be equal, helping catch impossible comparisons or refine types inside the check.
Click to reveal answer
What does TypeScript do after if (x === null)?
ANarrows <code>x</code> to <code>undefined</code> inside the block
BNarrows <code>x</code> to <code>null</code> inside the block
CNarrows <code>x</code> to <code>string</code> inside the block
DDoes not narrow <code>x</code>
✗ Incorrect
Inside the if block, TypeScript knows x must be null.
Given let val: string | number; what is val inside if (typeof val === 'string')?
Astring
Bboolean
Cstring | number
Dnumber
✗ Incorrect
The typeof check narrows val to string inside the block.
Does equality narrowing work with enum types in TypeScript?
AOnly with numeric enums
BNo, enums are not narrowed
COnly with string enums
DYes, it narrows based on enum values
✗ Incorrect
Equality narrowing works with enums by narrowing to specific enum values.
What happens if you compare two union type variables with ===?
ATypeScript narrows both to overlapping types
BTypeScript throws an error
CTypeScript ignores the check
DTypeScript widens the types
✗ Incorrect
TypeScript narrows both variables to the types that can be equal.
Which operator triggers equality narrowing in TypeScript?
A+
B-
C===
D*
✗ Incorrect
The strict equality operator === triggers equality narrowing.
Explain how equality narrowing helps TypeScript understand variable types inside an if statement.
Think about how checking if a variable equals a value changes what TypeScript knows about it.
You got /4 concepts.
Describe what happens when you compare two union type variables with === in TypeScript.
Consider how TypeScript finds common types that can be equal.
You got /3 concepts.
Practice
(1/5)
1. What does equality narrowing in TypeScript help you do?
easy
A. It lets TypeScript know the exact type after checking equality.
B. It automatically converts types without checks.
C. It disables type checking for variables.
D. It only works with numbers, not strings.
Solution
Step 1: Understand equality narrowing concept
Equality narrowing means TypeScript uses equality checks (like ===) to know the exact type of a variable.
Step 2: Compare options with definition
Only It lets TypeScript know the exact type after checking equality. correctly describes this behavior. Others are incorrect or unrelated.
Final Answer:
It lets TypeScript know the exact type after checking equality. -> Option A
Quick Check:
Equality narrowing = exact type after equality check [OK]
Hint: Equality narrowing means type known after === check [OK]
Common Mistakes:
Thinking it converts types automatically
Believing it disables type checking
Assuming it only works for numbers
2. Which of the following is the correct syntax to check equality for narrowing in TypeScript?
easy
A. if (value === 10) { }
B. if (value = 10) { }
C. if (value == 10) { }
D. if (value != 10) { }
Solution
Step 1: Identify correct equality operator for narrowing
TypeScript uses strict equality === for safe type narrowing.
Step 2: Check each option
if (value === 10) { } uses ===, which is correct. if (value == 10) { } uses loose equality, which is less safe. if (value = 10) { } is assignment, not comparison. if (value != 10) { } is inequality, not equality.
Final Answer:
if (value === 10) { } -> Option A
Quick Check:
Use === for equality narrowing [OK]
Hint: Use === for equality narrowing, not == or = [OK]
Common Mistakes:
Using = instead of ===
Using == which is not strict
Confusing != with ===
3. What will be the output of this TypeScript code?
function check(x: string | number) {
if (typeof x === 'string') {
return x.toUpperCase();
} else {
return x.toFixed(2);
}
}
console.log(check(3.14159));
medium
A. "3.14" (error)
B. "3.14" (string)
C. "3.14"
D. "3.14" (number)
Solution
Step 1: Understand type narrowing in function
The function checks if x is a string or number using typeof. For number, it calls toFixed(2).
Step 2: Evaluate output for input 3.14159
Since input is number, it returns 3.14159.toFixed(2) which is string "3.14".
Final Answer:
"3.14" -> Option C
Quick Check:
Number input returns toFixed string "3.14" [OK]
Hint: toFixed returns string, so output is "3.14" [OK]
Common Mistakes:
Thinking toFixed returns number
Confusing string and number output
Ignoring type narrowing with typeof
4. Identify the error in this TypeScript code using equality narrowing:
function process(value: string | number) {
if (value === 'hello') {
return value.toUpperCase();
} else {
return value.toUpperCase();
}
}
medium
A. Error: should use == instead of ===.
B. No error, code is correct.
C. Error: missing else if for number type.
D. Error: calling toUpperCase on number in else block.
Solution
Step 1: Analyze type narrowing with equality check
The check value === 'hello' narrows value to string only if it equals 'hello'. Else block still has value as string or number.
Step 2: Identify error in else block
Calling toUpperCase() on value in else block is unsafe because value could be number, causing runtime error.
Final Answer:
Error: calling toUpperCase on number in else block. -> Option D
Quick Check:
toUpperCase on number causes error [OK]
Hint: Check types before calling string methods [OK]
Common Mistakes:
Assuming else block is string only
Using == instead of === for narrowing
Ignoring runtime errors from wrong method calls
5. Given this TypeScript code, what is the correct way to safely handle both types using equality narrowing?
function formatValue(val: string | number | null) {
if (val === null) {
return "No value";
} else if (typeof val === 'string') {
return val.trim();
} else {
return val.toFixed(1);
}
}
hard
A. Missing check for undefined, so unsafe.
B. Code is correct and safely narrows all types.
C. Should use == null instead of === null for null check.
D. toFixed should be called only after checking val is number.
Solution
Step 1: Check null handling
The first if checks val === null, safely handling null case.
Step 2: Check type narrowing for string and number
The else if uses typeof val === 'string' to narrow string, else block handles number with toFixed(1).
Step 3: Confirm all cases covered
All possible types (null, string, number) are handled safely with proper narrowing.
Final Answer:
Code is correct and safely narrows all types. -> Option B
Quick Check:
All types handled safely with === and typeof [OK]
Hint: Check null first, then typeof for string, else number [OK]
Common Mistakes:
Forgetting null check
Using == null which includes undefined
Calling toFixed without type check
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.