Nested conditional types in Typescript - Time & Space Complexity
We want to understand how the time it takes to evaluate nested conditional types grows as the input type changes.
Specifically, how does the complexity increase when conditions are inside other conditions?
Analyze the time complexity of the following TypeScript nested conditional type.
type NestedCheck = T extends string
? T extends "hello"
? true
: false
: false;
This type checks if T is a string, and if so, checks if it is exactly "hello".
Look for repeated checks or evaluations inside the type.
- Primary operation: Conditional type checks nested inside another conditional.
- How many times: Each check happens once per type evaluation, but nested checks depend on the outer condition.
As the input type changes, the nested checks happen only if the outer condition is true.
| Input Size (n) | Approx. Operations |
|---|---|
| 1 (simple type) | 2 checks (outer + inner) |
| 10 (union of types) | Up to 20 checks (each type checked twice) |
| 100 (larger union) | Up to 200 checks |
Pattern observation: The number of checks grows linearly with the number of types in the input.
Time Complexity: O(n)
This means the time to evaluate grows directly in proportion to the number of types being checked.
[X] Wrong: "Nested conditional types multiply the time exponentially."
[OK] Correct: Each nested check only happens if the outer condition passes, so the total checks add up linearly, not multiply exponentially.
Understanding how nested conditional types scale helps you write efficient type logic and explain your reasoning clearly in interviews.
"What if the nested conditional type had multiple layers instead of just two? How would the time complexity change?"
Practice
What does a nested conditional type in TypeScript allow you to do?
Example: type Example<T> = T extends string ? (T extends 'hello' ? number : boolean) : null;
Solution
Step 1: Understand the conditional type structure
The type checks ifTextendsstring. If yes, it checks again ifTextends'hello'.Step 2: Recognize nested conditions
This shows a condition inside another condition, allowing different results based on multiple checks.Final Answer:
Check multiple conditions inside one type to decide the result type -> Option BQuick Check:
Nested conditional types = multiple checks [OK]
- Thinking nested means unrelated types
- Confusing conditional types with functions
- Assuming loops work inside types
Which of the following is the correct syntax for a nested conditional type in TypeScript?
type Result<T> = T extends number ? (T extends 5 ? 'Five' : 'Other') : 'Not a number';
Solution
Step 1: Check the syntax of nested conditional types
Nested conditional types use the syntaxcondition ? (nested condition ? trueType : falseType) : elseType.Step 2: Identify correct parentheses and keywords
type Result<T> = T extends number ? (T extends 5 ? 'Five' : 'Other') : 'Not a number'; correctly uses parentheses and the ternary?and:operators. Options A, B, and D have syntax errors or invalid keywords.Final Answer:
type Result<T> = T extends number ? (T extends 5 ? 'Five' : 'Other') : 'Not a number'; -> Option DQuick Check:
Correct nested syntax = type Result<T> = T extends number ? (T extends 5 ? 'Five' : 'Other') : 'Not a number'; [OK]
- Omitting parentheses around nested condition
- Using if/then syntax inside types
- Using braces {} instead of parentheses
What is the resulting type of CheckType<"hello"> given this code?
type CheckType<T> = T extends string ? (T extends "hello" ? number : boolean) : null;
Solution
Step 1: Evaluate outer condition
Tis"hello", which extendsstring, so the outer condition is true.Step 2: Evaluate inner condition
Now check ifTextends"hello". It does, so the inner condition returnsnumber.Final Answer:
number -> Option CQuick Check:
"hello" extends "hello" = number [OK]
- Ignoring inner condition and picking boolean
- Choosing null because of outer else
- Confusing string literal with string type
Identify the error in this nested conditional type:
type Test<T> = T extends number ? T extends 10 ? 'Ten' : 'Other' : 'Not a number'
Solution
Step 1: Check nested conditional syntax
The nested conditionalT extends 10 ? 'Ten' : 'Other'must be wrapped in parentheses to group it properly.Step 2: Identify missing parentheses impact
Without parentheses, TypeScript cannot parse the nested condition correctly, causing a syntax error.Final Answer:
Missing parentheses around the nested conditional -> Option AQuick Check:
Nested condition needs parentheses [OK]
- Forgetting parentheses causes syntax errors
- Thinking semicolon is required inside type
- Misusing extends keyword
Given this nested conditional type, what is the type of Result<string | number>?
type Result<T> = T extends string ? (T extends 'a' ? 1 : 2) : (T extends number ? 3 : 4);
Solution
Step 1: Distribute conditional over union types
ForT = string | number, TypeScript applies the conditional to each union member separately.Step 2: Evaluate each branch
Forstring: if'a'then1else2. Fornumber:3. So combined type is1 | 2 | 3.Final Answer:
1 | 2 | 3 -> Option AQuick Check:
Union splits nested condition = 1|2|3 [OK]
- Including 4 which is for non-string/number
- Not splitting union types correctly
- Assuming single output type for union
Ready to prove it?
Pass the test and this pattern moves unknown
