Conditional types help TypeScript choose different types based on conditions. This makes your code smarter and safer by adapting types automatically.
When you want a type to change depending on another type.
When you need to create flexible functions that work with many types but behave differently.
When you want to check if a type has a certain property and act accordingly.
When you want to build reusable components that adapt their types based on input.
When you want to avoid writing many similar types by combining them with conditions.
Syntax
Typescript
type Name<T> = T extends U ? X : Y;
T is the type you check.
If T fits U, then the type becomes X, otherwise Y.
Examples
This type returns "Yes" if T is a string, otherwise "No".
Typescript
type IsString<T> = T extends string ? "Yes" : "No";
This extracts the type inside an array, or returns T if it is not an array.
Typescript
type ElementType<T> = T extends (infer U)[] ? U : T;
Sample Program
This program defines a conditional type that checks if a type is number. It then uses it with number and string types and prints the results.
Typescript
type IsNumber<T> = T extends number ? "Number" : "Not Number";
// Test with numberlet a: IsNumber<number> = "Number";
// Test with stringlet b: IsNumber<string> = "Not Number";
console.log(a);
console.log(b);
OutputSuccess
Important Notes
Conditional types let TypeScript pick types based on logic, making your code more flexible.
They work well with generics to create smart reusable code.
Summary
Conditional types choose types based on conditions.
They help write flexible and safe code.
Use them to adapt types automatically depending on input.
Practice
(1/5)
1. Why do we need conditional types in TypeScript? type Result<T> = T extends number ? string : boolean;
easy
A. To create loops in type definitions
B. To declare variables without types
C. To run code only if a condition is true
D. To select a type based on a condition, making code flexible
Solution
Step 1: Understand conditional types purpose
Conditional types allow choosing one type or another based on a condition, like T extends number ? string : boolean.
Step 2: Match the purpose with options
To select a type based on a condition, making code flexible correctly describes this as selecting a type based on a condition for flexibility.
Final Answer:
To select a type based on a condition, making code flexible -> Option D
Quick Check:
Conditional types choose types conditionally = D [OK]
Hint: Conditional types pick types based on conditions [OK]
Common Mistakes:
Confusing conditional types with runtime if statements
Thinking conditional types declare variables
Believing conditional types create loops
2. Which of the following is the correct syntax for a conditional type in TypeScript?
easy
A. type Check<T> = T extends string ? number : boolean;
B. type Check<T> = if T then string else number;
C. type Check<T> = T ? string : number;
D. type Check<T> = T == string ? number : boolean;
Solution
Step 1: Recall conditional type syntax
The correct syntax uses extends to check type relations: T extends U ? X : Y.
Step 2: Identify correct option
type Check<T> = T extends string ? number : boolean; matches this syntax exactly. Options A, B, and D use invalid syntax for types.
Final Answer:
type Check<T> = T extends string ? number : boolean; -> Option A
Quick Check:
Conditional type syntax uses extends = C [OK]
Hint: Look for 'extends' keyword in conditional types [OK]
Common Mistakes:
Using runtime if/else syntax in types
Using == instead of extends
Omitting the extends keyword
3. What is the output type of this code?
type Check<T> = T extends string ? number : boolean;
type Result = Check<'hello'>;
medium
A. string
B. number
C. boolean
D. any
Solution
Step 1: Evaluate the conditional type with T = 'hello'
Since 'hello' is a string, T extends string is true.
Step 2: Determine the resulting type
Because the condition is true, the type becomes number.
Final Answer:
number -> Option B
Quick Check:
'hello' extends string = number [OK]
Hint: Check if type matches condition to pick true branch [OK]
Common Mistakes:
Confusing the true and false branches
Thinking the output is string literal
Assuming any or unknown type
4. Identify the error in this conditional type:
type Check<T> = T extends number ? 'num' : 'not num';
type Result = Check<>;
medium
A. Wrong use of extends keyword
B. Conditional types cannot return string literals
C. Missing type argument in Check<>
D. Result type must be declared with let or const
Solution
Step 1: Check usage of generic type parameter
The type alias Check requires a type argument, but Check<> is missing it.
Step 2: Confirm other parts are correct
The extends keyword and string literal return types are valid. Declaring a type does not use let or const.
Final Answer:
Missing type argument in Check<> -> Option C
Quick Check:
Generic types need arguments = B [OK]
Hint: Always provide type arguments for generic types [OK]
Common Mistakes:
Leaving generic type arguments empty
Confusing type aliases with variables
Thinking extends is invalid in types
5. Given this conditional type, what is the type of Flattened?
type Flatten<T> = T extends Array ? U : T;
type Flattened = Flatten;
hard
A. number | string
B. number[] | string
C. Array
D. never
Solution
Step 1: Analyze the conditional type with union input
The input is number[] | string. Conditional types distribute over unions, so it applies separately to number[] and string.
Step 2: Apply Flatten to each part
For number[], it matches Array<infer U> with U = number, so result is number. For string, it does not match array, so result is string.
Step 3: Combine results
The combined result is number | string.
Final Answer:
number | string -> Option A
Quick Check:
Conditional types distribute over unions = A [OK]
Hint: Remember conditional types distribute over union types [OK]
Common Mistakes:
Not distributing over union types
Returning array instead of element type
Confusing infer usage
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.