Tuples in TypeScript: A Complete Guide

Updated: January 7, 2024 By: Guest Contributor Post a comment

Overview

TypeScript enhances JavaScript’s capabilities by including types and various other features, one of which is tuples. Tuples are fixed-size arrays where each element can be of a distinct type. This guide covers everything you need to know about tuples in TypeScript, complete with practical examples.

Introduction to Tuples

In TypeScript, a tuple is a type that allows you to express an array with a fixed number of elements whose types are known, but do not necessarily have to be the same. Compared to arrays, which typically have elements of a single type, tuples provide the flexibility of having multiple types in one structured collection.

let userInfo: [string, number];
userInfo = ['John Doe', 30]; // Correct
userInfo = [30, 'John Doe']; // Error: Type 'number' is not assignable to type 'string'

Declaring and Initializing Tuples

Creating tuples in TypeScript is straightforward. Here’s how you can declare and initialize a tuple.

let employee: [number, string, boolean];
employee = [1, 'Alice', true];

This tuple specifies that the first element is a number, the second is a string, and the third is a boolean. The sequence in which you declare the types is how TypeScript understands and enforces them.

Accessing Tuple Elements

Once a tuple is declared, you can access its elements by using their index, just like an array.

let person: [string, number];
person = ['Bob', 35];
console.log(person[0]); // Outputs 'Bob'
console.log(person[1]); // Outputs 35

Tuple Operations

Tuples in TypeScript behave like arrays in many ways, meaning you can use array methods on them. Here’s how you can manipulate tuples with methods like push() and pop().

let colors: [string, string] = ['purple', 'orange'];
colors.push('green');
console.log(colors); // Outputs ['purple', 'orange', 'green']

Types for Tuples

Advanced tuple usage includes optional elements, read-only tuples, and rest elements with spread syntax.

type StringNumberBoolean = [string, number, boolean?];
let data: StringNumberBoolean = ['Environment', 42]; // Valid

// Readonly tuples restrict the mutation of their elements:
type ReadonlyUserInfo = readonly [string, number];
const readonlyTuple: ReadonlyUserInfo = ['Alice', 28];
// readonlyTuple[0] = 'Bob'; // Error: Index signature in type 'readonly [string, number]' only permits reading

Tuple with Rest Elements

Tuples in TypeScript can use the rest element syntax to specify zero or more elements of a certain type.

let scores: [string, ...number[]] = ['Math', 98, 85, 90];
// 'Math' is of type string, and subsequent elements are of type number.

Type Assertion with Tuples

You can use type assertion to treat an array as a tuple if TypeScript does not infer the tuple type automatically.

let address = [221, 'Baker Street', 'NW1 6XE'] as [number, string, string];

Generic Tuples

TypeScript’s generic tuples allow you to create reusable tuple types with generic placeholders.

function pair<K, V>(key: K, value: V): [K, V] {
    return [key, value];
}

let result = pair('isAwesome', true); // result has the type [string, boolean]

Destructuring Tuples

Tuple destructuring works similarly to array destructuring, letting you unpack the elements into separate variables.

let point: [number, number] = [7, 5];

const [x, y] = point;
console.log(x); // 7
console.log(y); // 5

When to Use Tuples

Tuples are particularly useful when you need to return multiple values from a function or when you want to model a set of values as a single entity without creating a formal class or interface.

Conclusion

This comprehensive guide delves into what tuples are, how to declare and manipulate them, and their practical applications. Armed with this knowledge, you can now effectively use tuples in your TypeScript code to write cleaner and more precise type definitions.