Guard types in Typescript

Published: May 29, 2023

One of the powerful features TypeScript offers is guard types. Guard types can be used to check for specific types of data within a given code block. If you have a function that takes an object, you can use a guard type to ensure that the object is of a particular type before proceeding with the rest of the function.

Overall, guard types are an excellent tool for any TypeScript developer looking to write more reliable code.

Defining a Guard Type

To define a guard type in TypeScript, you need to create a type predicate function. A type predicate function takes an input and returns a boolean value, indicating whether the input satisfies a specific type.

Here’s an example of a guard…

interface Animal {
	type: string;
}

interface Cat extends Animal {
	meow: () => void;
}

interface Dog extends Animal {
	bark: () => void;
}

function isCatOrDog(animal: Animal): animal is Cat | Dog {
	return animal.type === 'cat' || animal.type === 'dog';
}

Using Guard Types

Once you have defined a guard type, you can use it to refine the type of a variable within a conditional block. Consider the following code snippet:

function processAnimal(animal: Animal) {
	if (isCatOrDog(animal)) {
		if (animal.type === 'cat') {
			// TypeScript now knows that `animal` is a Cat
			animal.meow();
		} else {
			// TypeScript now knows that `animal` is a Dog
			animal.bark();
		}
	} else {
		console.log('Animal is neither a cat nor a dog.');
	}
}

Why Guard Types?

Guard types offer several benefits that contribute to the overall robustness and maintainability of your TypeScript codebase

  1. Guard types provide additional runtime type checks, allowing you to catch type errors early in the development process.
  2. By using guard types, TypeScript can narrow down the type of a variable within specific code blocks, providing more accurate type information.
  3. Guard types improve code readability by making the intent of the type checks explicit, and we like being explicit!

© 2023 Victor Jimvid