Unlocking TypeScript’s Potential: A Deep Dive into Optional, Union, and Intersection Types

Greetings, TypeScript enthusiasts! Today, we’ll explore an advanced and versatile feature of TypeScript: Union Types and Intersection Types. Our aim is to understand their intricacies and utility in the TypeScript ecosystem.

Alex Martinez
3 min readJul 30, 2023

Optional Types: The Basics

Before we dive into Union and Intersection types, let’s refresh our understanding of optional types. In TypeScript, optional types denote properties that may or may not be present in an object. This is denoted by a ? symbol following the property name.

type Employee = {
name: string;
age?: number;
}

In the Employee type, name is a required property, but age is optional. Hence, we can create an Employee object without an age property.

Optional types are a fundamental building block in TypeScript. But the language’s versatility doesn’t stop there. For scenarios where properties can take different forms based on various conditions, TypeScript gives us Union types and Intersection types.

Union and Intersection Types: Unveiled

Union types allow us to declare a type that could be one of several types, denoted by the | symbol. On the other hand, intersection types combine multiple types into one, represented by the & symbol.

Here’s an example:

type Product = {
id: string
} & (
| {
type: 'book';
author: string;
}
| {
type: 'electronics';
brand: string;
}
)

Here’s how it works:

  • The Product type is an intersection (&) of two types.
  • The first type is { id: string }, which means an object with an id property that is a string.
  • The second type is a union (|) of two different object shapes. It means the object can either have a type of 'book' with an author property, or a type of 'electronics' with a brand property.

In other words, the Product type represents an object that must always have an id property and either be a 'book' with an author or an 'electronics' item with a brand.

Practical Examples

Let’s illustrate this with some examples:

let product1: Product = {
id: 'p123',
type: 'book',
author: 'George Orwell'
}

let product2: Product = {
id: 'p456',
type: 'electronics',
brand: 'Apple'
}

In the above examples, product1 is a valid Product type object because it has an id property, and type is 'book' with an author property. Similarly, product2 is also valid as it has an id property, and type is 'electronics' with a brand property.

However, the following example will result in a TypeScript error:

let product3: Product = {
id: 'p789',
type: 'book',
brand: 'Penguin'
}

The product3 object is not a valid Product type object because, for type 'book', the associated property should be author, not brand.

Conclusion

Optional types, Union types, and Intersection types are powerful features of TypeScript that allow us to create complex and flexible type definitions. They allow us to accurately describe the shape of JavaScript objects, leading to safer and more predictable code.

The key to mastering these types is understanding their utility and practicing them in your TypeScript projects. So, explore them and bring your TypeScript skills to a new level!

Keep coding, and until next time!

--

--

Alex Martinez

TypeScript enthusiast simplifying complex concepts one article at a time. Join me in our journey to unravel the power of TypeScript!