Generics & Constraints in TypeScript (Live Playground)
In this tutorial, we will explore generics and constraints in TypeScript. Understanding how to use generics and constraints will help you write reusable and type-safe code.
Generics
Generics allow you to create reusable and type-safe functions and classes that can work with different types. They can be used to create utility functions, such as a function that merges two objects or a function that returns the length of an array:
function merge<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
const person = { name: 'John Doe' };
const employee = { title: 'Software Developer' };
const fullTimeEmployee = merge(person, employee);
console.log(fullTimeEmployee); // Output: { name: 'John Doe', title: 'Software Developer' }
In this example, we create a generic function merge
that accepts two objects of different types and returns an object that combines the properties of both objects.
Constraints
Constraints allow you to create more restrictive generics that enforce certain conditions on the types used. They can be used to create more type-safe utility functions and classes:
interface Lengthwise {
length: number;
}
function getLength<T extends Lengthwise>(item: T): number {
return item.length;
}
console.log(getLength('Hello, world!')); // Output: 13
console.log(getLength([1, 2, 3, 4])); // Output: 4
In this example, we create an interface Lengthwise
and a generic function getLength
that accepts an item of a type that extends Lengthwise
. The getLength
function returns the length of the item.
Using Generics and Constraints
Generics and constraints can be used in a variety of scenarios to create more reusable and type-safe code:
- Creating utility functions and classes that can work with different types, for example, by creating a function that merges two objects or a function that returns the length of an array.
- Enforcing certain conditions on the types used in generics, for example, by creating a function that accepts items with a
length
property. - Writing more expressive and type-safe code in scenarios where types depend on other types, for example, by creating a generic
Promise
type that can be used with different types of values.
Conclusion
In this tutorial, we have explored generics and constraints in TypeScript. Understanding how to use generics and constraints effectively will enable you to create more reusable and type-safe code.