LibraryUnion Types and Intersection Types

Union Types and Intersection Types

Learn about Union Types and Intersection Types as part of Complete React Development with TypeScript

Mastering Union and Intersection Types in TypeScript for React

As React developers, leveraging TypeScript's advanced type system is crucial for building robust and maintainable applications. Union and Intersection types are powerful tools that allow us to define more flexible and precise data structures, especially when dealing with component props, state, and API responses.

Understanding Union Types (|)

Union types allow a variable or parameter to accept one of several possible types. This is incredibly useful when a value can be one thing or another, such as a string that might also be a number, or a prop that can be either a string or null.

Union types let a value be one of several types.

Think of a union type as a 'choose one' option. For example, string | number means a variable can hold either a string or a number, but not both simultaneously.

In TypeScript, the pipe symbol | is used to create union types. For instance, type Status = 'loading' | 'success' | 'error'; defines a type Status that can only be one of these three literal string values. When you use a union type, TypeScript will check if the value conforms to any of the types in the union. This is particularly helpful for defining props that can accept different kinds of input or for handling API responses that might have varying structures.

What symbol is used to define a union type in TypeScript?

The pipe symbol (|).

Understanding Intersection Types (&)

Intersection types combine multiple types into a single type. A value of an intersection type will have all the properties and methods of each type in the union. This is like saying a value must be 'this AND that'.

Intersection types combine multiple types into one.

Intersection types are like merging objects. If you have type A and type B, an intersection type A & B means the value must have all properties from A AND all properties from B.

The ampersand symbol & is used for intersection types. For example, type AdminUser = User & { isAdmin: true }; means an AdminUser must have all the properties of a User type and an additional isAdmin property set to true. This is extremely useful for composing types, extending interfaces, and creating more specific types by combining general ones. For React components, this can be used to merge common prop types with specific ones.

What symbol is used to define an intersection type in TypeScript?

The ampersand symbol (&).

Practical Application in React

Let's consider a React component that accepts a

code
variant
prop which can be either 'primary' or 'secondary', and also requires a
code
size
prop which can be 'small' or 'large'. We can define this using union types.

Consider a Button component that can accept a color prop which can be either a string or a number, and also needs to include a disabled boolean property. We can define this using both union and intersection types.

type AllowedColor = string | number;

interface ButtonProps {
  color: AllowedColor;
  disabled: boolean;
}

// Using intersection to combine a base component with specific props
interface PrimaryButtonProps extends ButtonProps {
  variant: 'primary';
}

interface SecondaryButtonProps extends ButtonProps {
  variant: 'secondary';
}

type CombinedButtonProps = PrimaryButtonProps | SecondaryButtonProps;

// Example usage:
const myButton: CombinedButtonProps = {
  color: '#3498db',
  disabled: false,
  variant: 'primary'
};

const anotherButton: CombinedButtonProps = {
  color: 123456,
  disabled: true,
  variant: 'secondary'
};

This demonstrates how union types (string | number) define flexibility for a single property, while intersection types (implicitly through extends or explicitly with &) combine multiple type definitions to create a more comprehensive type for component props.

📚

Text-based content

Library pages focus on text content

FeatureUnion Types (|)Intersection Types (&)
PurposeAllows a value to be one of several types.Combines multiple types into a single type, requiring all properties.
AnalogyA 'choose one' option.Merging or combining properties from multiple sources.
Use Case ExampleA status that can be 'pending', 'completed', or 'failed'.A user object that must have base user properties AND specific admin properties.
SyntaxTypeA | TypeBTypeA & TypeB

When using union types, be mindful of how TypeScript narrows down the type within conditional blocks. For intersection types, ensure that the combined types don't create conflicting requirements.

Key Takeaways

Union types provide flexibility by allowing a variable to hold values of different specified types. Intersection types create a new type that has all the members of the original types. Mastering these concepts will significantly enhance your ability to write type-safe and expressive React components with TypeScript.

Learning Resources

TypeScript Union Types - Official Documentation(documentation)

The official TypeScript handbook provides a clear explanation of union types, their syntax, and common use cases.

TypeScript Intersection Types - Official Documentation(documentation)

Learn about intersection types from the source, including how they are used to combine types and create new ones.

Understanding TypeScript's Union and Intersection Types(blog)

A practical blog post that breaks down union and intersection types with relatable examples, often including React contexts.

TypeScript for React Developers - Union Types(documentation)

A cheatsheet specifically tailored for React developers, explaining how to apply TypeScript types, including unions, within React projects.

TypeScript for React Developers - Intersection Types(documentation)

This resource focuses on intersection types and their practical application when building React components with TypeScript.

Advanced TypeScript Types: Union and Intersection(video)

A video tutorial that visually explains the concepts of union and intersection types, often with code examples.

Type Aliases in TypeScript(documentation)

Understand how type aliases are fundamental to creating reusable union and intersection types, which is crucial for React development.

Using TypeScript with React: A Comprehensive Guide(blog)

A comprehensive guide to using TypeScript in React, often touching upon advanced types like unions and intersections in practical scenarios.

TypeScript Utility Types(documentation)

Explore utility types like `Pick`, `Omit`, and `Partial`, which often work in conjunction with union and intersection types to manipulate existing types.

The Power of TypeScript's Union and Intersection Types(blog)

A blog post highlighting the benefits and practical applications of using union and intersection types for more robust code.