What are distributive conditional types in TypeScript?
Distributive conditional types automatically apply a conditional type to each member of a union type separately, then combine the results back into a union.
Click to reveal answer
beginner
How does TypeScript distribute conditional types over unions?
If a conditional type checks a generic type that is a union, TypeScript applies the condition to each union member individually, then unions the results.
Click to reveal answer
beginner
Given type Example<T> = T extends string ? "yes" : "no"; What is Example<string | number>?
"yes" | "no" because the conditional type is applied separately to string and number and results are combined.
Click to reveal answer
intermediate
How can you prevent distributive behavior in conditional types?
Wrap the generic type in a tuple like [T] extends [U] ? X : Y to stop distribution over unions.
Click to reveal answer
intermediate
Why are distributive conditional types useful?
They let you write flexible types that automatically handle each union member, making type transformations easier and more powerful.
Click to reveal answer
What happens when a conditional type is applied to a union type in TypeScript?
AThe conditional type is applied to each union member separately.
BThe conditional type is ignored.
CThe conditional type applies only to the first union member.
DThe conditional type applies only if the union has one member.
✗ Incorrect
Distributive conditional types apply the condition to each member of the union separately.
How do you stop a conditional type from distributing over a union?
AUse the 'unknown' type.
BUse the 'never' type.
CUse the 'any' type.
DWrap the type in a tuple like [T].
✗ Incorrect
Wrapping the type in a tuple prevents distribution by making the type no longer a naked type parameter.
What is the result of type R = (string | number) extends string ? true : false;?
Afalse
Btrue
Cstring | number
Dnever
✗ Incorrect
The conditional is not distributive here because the checked type is not a naked type parameter, so it returns false.
Given type T<T> = T extends number ? 'num' : 'not num';, what is T?
A'not num'
B'num'
C'num' | 'not num'
Dstring | number
✗ Incorrect
The conditional type distributes over the union, applying to each member separately.
Which of these is a key feature of distributive conditional types?
AThey convert types to strings.
BThey automatically apply conditions to each union member.
CThey only work with arrays.
DThey prevent type inference.
✗ Incorrect
Distributive conditional types apply the condition to each member of a union automatically.
Explain what distributive conditional types are and how they work with union types in TypeScript.
Think about how a condition checks each part of a union separately.
You got /4 concepts.
Describe a method to prevent a conditional type from distributing over a union type and why you might want to do that.
Consider how wrapping changes the type shape.
You got /4 concepts.
Practice
(1/5)
1. What does a distributive conditional type do in TypeScript? T extends U ? X : Y when T is a union type?
easy
A. Applies the condition separately to each member of the union type
B. Applies the condition once to the entire union type as a whole
C. Always returns the true branch X regardless of T
D. Always returns the false branch Y regardless of T
Solution
Step 1: Understand conditional types with unions
When T is a union, TypeScript distributes the condition over each member separately.
Step 2: Apply distributive behavior
Each member of T is checked against U individually, returning X or Y per member.
Final Answer:
Applies the condition separately to each member of the union type -> Option A
Quick Check:
Distributive conditional types = separate checks per union member [OK]
Hint: Remember: conditional types split unions into parts [OK]
Common Mistakes:
Thinking the condition applies once to the whole union
Assuming it always returns true or false branch
Confusing distributive with non-distributive conditional types
2. Which of the following is the correct syntax for a distributive conditional type in TypeScript?
easy
A. type Result<T> = if (T extends string) number else boolean;
B. type Result<T> = T => string ? number : boolean;
C. type Result<T> = T ? number : boolean;
D. type Result<T> = T extends string ? number : boolean;
Solution
Step 1: Recall correct conditional type syntax
Conditional types use T extends U ? X : Y syntax in TypeScript.
Step 2: Match syntax with options
type Result<T> = T extends string ? number : boolean; matches the correct syntax; others use invalid or incorrect syntax.
Final Answer:
type Result<T> = T extends string ? number : boolean; -> Option D
Quick Check:
Conditional types use extends ? : syntax [OK]
Hint: Look for extends ? : pattern in type definitions [OK]
Common Mistakes:
Using if-else instead of conditional operator
Missing the extends keyword
Using arrow functions incorrectly in type definitions
3. Given the type:
type FilterString<T> = T extends string ? T : never; type Result = FilterString<'a' | 1 | 'b' | true>;
What is the type of Result?
medium
A. never
B. 'a' | 1 | 'b' | true
C. 'a' | 'b'
D. string
Solution
Step 1: Apply distributive conditional type to each union member
Each member is checked: 'a' extends string (true), 1 extends string (false), 'b' extends string (true), true extends string (false).
Step 2: Collect true branch results
Only 'a' and 'b' remain; others become never and are removed from union.
Final Answer:
'a' | 'b' -> Option C
Quick Check:
FilterString filters strings only = 'a' | 'b' [OK]
Hint: Distributive types filter unions by returning never for false cases [OK]
Common Mistakes:
Thinking the whole union is returned unchanged
Confusing never with empty string
Assuming the result is just string instead of filtered literals
4. Identify the error in this distributive conditional type:
type ExtractNumber<T> = [T] extends [number] ? T : never; type Result = ExtractNumber<'a' | 1 | 2>;
medium
A. The condition is wrapped in a tuple, so distribution does not occur
B. The syntax is invalid because of missing extends keyword
C. The type will always return never
D. The union type is not allowed in conditional types
Solution
Step 1: Understand tuple wrapping effect
Wrapping T in a tuple disables distributive behavior in conditional types.
Step 2: Analyze impact on ExtractNumber
Since distribution is off, the whole union is checked at once, so 'a' | 1 | 2 extends number is false, returning never.
Final Answer:
The condition is wrapped in a tuple, so distribution does not occur -> Option A
Hint: Tuple brackets stop distribution in conditional types [OK]
Common Mistakes:
Assuming distribution still happens with tuple wrapping
Confusing syntax error with logic error
Thinking union types are not allowed in conditional types
5. How can you create a type that converts a union of types T into a union of their array types using distributive conditional types? Choose the correct type definition.
hard
A. type ToArray<T> = T extends any[] ? T : never;
B. type ToArray<T> = T extends any ? T[] : never;
C. type ToArray<T> = T[];
D. type ToArray<T> = [T] extends [any] ? T[] : never;
Solution
Step 1: Understand distributive conditional type for mapping
Using T extends any ? T[] : never applies the array transformation to each union member separately.
Step 2: Compare options
type ToArray<T> = T extends any ? T[] : never; correctly distributes and converts each member to an array type. type ToArray<T> = [T] extends [any] ? T[] : never; disables distribution by tuple wrapping. type ToArray<T> = T[]; wraps the whole union as an array, not each member. type ToArray<T> = T extends any[] ? T : never; filters arrays, not converts.
Final Answer:
type ToArray<T> = T extends any ? T[] : never; -> Option B