A discriminated union is a special kind of union type that uses a common literal property (called the discriminant) to tell which type in the union is being used. This helps TypeScript narrow down the type safely.
Click to reveal answer
beginner
How does TypeScript use the discriminant property to narrow types?
TypeScript checks the value of the discriminant property in a conditional statement. Based on its value, it knows exactly which type from the union is active and narrows the type accordingly.
Click to reveal answer
beginner
Example: Given a union type with a 'kind' property, how do you narrow it?
Use a switch or if statement on the 'kind' property. For example:
switch (shape.kind) { case 'circle': // shape is Circle here break; case 'square': // shape is Square here break; }
Click to reveal answer
intermediate
Why is discriminated union narrowing safer than using type assertions?
Because TypeScript automatically checks the discriminant property and narrows the type, it prevents mistakes that can happen if you manually tell TypeScript a type without checking. This reduces bugs.
Click to reveal answer
intermediate
What happens if you forget to handle one case in a discriminated union switch?
TypeScript can warn you if you enable strict checks. Missing a case means your code might not handle all possible types, which can cause runtime errors.
Click to reveal answer
What property is essential for discriminated union narrowing in TypeScript?
AA numeric index signature
BA common literal property shared by all union members
CA method with the same name in all types
DAn optional property
✗ Incorrect
Discriminated unions rely on a common literal property (discriminant) to distinguish types.
How does TypeScript narrow a discriminated union inside a switch statement?
ABy checking the value of the discriminant property in each case
BBy guessing the type based on variable name
CBy using runtime type information
DBy ignoring the discriminant property
✗ Incorrect
TypeScript uses the discriminant property's value in each case to narrow the type.
Which of these is a benefit of discriminated union narrowing?
AAutomatic type safety without manual assertions
BFaster runtime performance
CAllows any property to be accessed without checks
DRemoves the need for type annotations
✗ Incorrect
Discriminated unions provide automatic type safety by narrowing types based on a property.
What keyword is commonly used to check the discriminant property in TypeScript?
Atry
Bfor
Cwhile
Dswitch
✗ Incorrect
The switch statement is commonly used to check the discriminant property for narrowing.
If a discriminated union has a 'type' property with values 'A' or 'B', what happens if you check 'type === "A"'?
ATypeScript ignores the check
BTypeScript throws an error
CTypeScript narrows the variable to the type with 'type' equal to 'A'
DTypeScript narrows to both types
✗ Incorrect
Checking the discriminant property value narrows the variable to the matching type.
Explain how discriminated union narrowing works in TypeScript and why it is useful.
Think about how a shared property helps TypeScript know the exact type.
You got /5 concepts.
Describe a simple example of a discriminated union and how you would use a switch statement to narrow its type.
Use shapes like circle and square with a 'kind' property.
You got /4 concepts.
Practice
(1/5)
1.
What is the main purpose of a discriminated union in TypeScript?
easy
A. To force all types in a union to have the same properties
B. To create a union of unrelated types without any common property
C. To prevent any type narrowing in TypeScript
D. To use a common property to distinguish between different types in a union
Solution
Step 1: Understand discriminated union concept
A discriminated union uses a shared property (called discriminant) to identify which type is currently in use.
Step 2: Identify the purpose of the discriminant property
This shared property helps TypeScript narrow the type safely and access type-specific properties.
Final Answer:
To use a common property to distinguish between different types in a union -> Option D
Quick Check:
Discriminated union = common property for type narrowing [OK]
Hint: Look for a shared property that identifies the type [OK]
Confusing discriminated unions with type intersections
2.
Which of the following is the correct syntax to define a discriminated union type in TypeScript?
type Shape = ?
easy
A. type Shape = { radius: number } & { side: number }
B. type Shape = { circle: number } | { square: number }
C. type Shape = { kind: 'circle'; radius: number } | { kind: 'square'; side: number }
D. type Shape = { kind: number; radius: number } | { kind: number; side: number }
Solution
Step 1: Check for a shared discriminant property
type Shape = { kind: 'circle'; radius: number } | { kind: 'square'; side: number } uses 'kind' as a string literal property to distinguish types, which is correct.
Step 2: Verify property types and union structure
type Shape = { kind: 'circle'; radius: number } | { kind: 'square'; side: number } correctly defines two object types with 'kind' discriminant and specific properties.
Final Answer:
type Shape = { kind: 'circle'; radius: number } | { kind: 'square'; side: number } -> Option C
Quick Check:
Discriminated union needs a shared literal property [OK]
Hint: Use a string literal property as discriminant [OK]
Common Mistakes:
Using & instead of | for union
Not using a literal type for discriminant
Using number instead of string literal for discriminant
3.
What will be the output of the following TypeScript code?
type Animal =
| { type: 'dog'; barkVolume: number }
| { type: 'cat'; livesLeft: number };
function describe(animal: Animal) {
if (animal.type === 'dog') {
return `Dog barks at volume ${animal.barkVolume}`;
} else {
return `Cat has ${animal.livesLeft} lives left`;
}
}
console.log(describe({ type: 'cat', livesLeft: 7 }));
medium
A. "Cat has 7 lives left"
B. "Dog barks at volume 7"
C. Type error at compile time
D. Runtime error accessing property
Solution
Step 1: Analyze the input object and type check
The input has type 'cat' and livesLeft 7, matching the second union member.
Step 2: Follow the if condition and return value
Since animal.type is 'cat', the else branch runs, returning "Cat has 7 lives left".
Hint: Check the discriminant property value to pick branch [OK]
Common Mistakes:
Assuming wrong branch runs
Expecting compile or runtime errors
Confusing property names between types
4.
Identify the error in this TypeScript code using discriminated unions:
type Vehicle =
| { kind: 'car'; wheels: number }
| { kind: 'bike'; pedals: number };
function getWheels(vehicle: Vehicle) {
if (vehicle.kind === 'car') {
return vehicle.wheels;
} else {
return vehicle.wheels;
}
}
medium
A. Missing return type annotation on function
B. Accessing 'wheels' on bike type causes error
C. Incorrect discriminant property name
D. No error, code is correct
Solution
Step 1: Check property access in each branch
In the else branch, vehicle.kind is 'bike', but code accesses vehicle.wheels which does not exist on bike.
Step 2: Understand TypeScript error
This causes a compile-time error because 'wheels' is not a property of the bike type.
Final Answer:
Accessing 'wheels' on bike type causes error -> Option B
Quick Check:
Access only properties valid for narrowed type [OK]
Hint: Check property exists on all union members before access [OK]
Common Mistakes:
Assuming all properties exist on all types
Ignoring discriminant for narrowing
Thinking missing return type causes error
5.
Given the following discriminated union, how can you safely add a new shape type { kind: 'triangle'; base: number; height: number } and update the area function to handle it?
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; side: number };
function area(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.side ** 2;
}
}
hard
A. Add triangle to Shape union and add a case 'triangle' in switch returning 0.5 * base * height
B. Add triangle to Shape union but do not change area function
C. Add triangle to Shape union and add a default case returning -1
D. Add triangle to Shape union and remove switch statement
Solution
Step 1: Extend the discriminated union type
Add { kind: 'triangle'; base: number; height: number } to the Shape union to include the new shape.
Step 2: Update the area function switch
Add a new case 'triangle' that calculates area as 0.5 * base * height to handle the new shape safely.
Final Answer:
Add triangle to Shape union and add a case 'triangle' in switch returning 0.5 * base * height -> Option A
Quick Check:
Update union and switch for new discriminant case [OK]
Hint: Add new type and matching switch case for safe narrowing [OK]
Common Mistakes:
Forgetting to update the function for new type
Using default case instead of explicit case
Removing switch and losing type safety
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.