TypeScript Tuples

Fixed-length arrays with specific types

🎯 What are Tuples?

Tuples are special arrays with fixed length and specific types for each position. Unlike regular arrays, each element can have a different type, and the order matters for type checking.


// Tuple: [string, number, boolean]
let user: [string, number, boolean];
user = ["Alice", 25, true];  // Correct order
                                    

Output:

user: ["Alice", 25, true]

Tuples vs Arrays

📊

Regular Array

Same type, any length

let arr: number[] = [1, 2, 3];
arr.push(4); // OK
🎯

Tuple

Fixed types and length

let tuple: [string, number];
tuple = ["Alice", 25]; // OK

🔹 Creating Tuples

Define tuples with specific types in order:

// Basic tuple
let person: [string, number];
person = ["Alice", 25];  // ✅ Correct

// ❌ Wrong order
// person = [25, "Alice"];  // Error

// ❌ Wrong type
// person = ["Alice", "25"];  // Error

// Tuple with multiple types
let product: [string, number, boolean];
product = ["Laptop", 999.99, true];

console.log(product[0]);  // "Laptop"
console.log(product[1]);  // 999.99
console.log(product[2]);  // true

Output:

Laptop

999.99

true

🔹 Accessing Tuple Elements

Access elements by index with type safety:

// Define a tuple
let employee: [string, number, string] = ["John", 12345, "Manager"];

// Access elements
let name = employee[0];      // string
let id = employee[1];        // number
let role = employee[2];      // string

console.log(`${name} (ID: ${id}) - ${role}`);

// TypeScript knows the types
let upperName = employee[0].toUpperCase();  // OK - string method
let doubled = employee[1] * 2;              // OK - number operation

console.log(upperName);  // "JOHN"
console.log(doubled);    // 24690

Output:

John (ID: 12345) - Manager

JOHN

24690

🔹 Readonly Tuples

Make tuples immutable with readonly:

// Readonly tuple
let point: readonly [number, number] = [10, 20];

// ✅ Reading is OK
console.log(point[0]);  // 10
console.log(point[1]);  // 20

// ❌ Cannot modify
// point[0] = 30;  // Error: Cannot assign to '0' because it is a read-only property
// point.push(30); // Error: Property 'push' does not exist

// Use case: Coordinates that shouldn't change
let origin: readonly [number, number] = [0, 0];

Output:

10

20

🔹 Optional Tuple Elements

Make tuple elements optional with ?:

// Optional elements (must be at the end)
let user: [string, number, boolean?];

user = ["Alice", 25, true];   // ✅ OK
user = ["Bob", 30];           // ✅ OK - boolean is optional

// Multiple optional elements
let data: [string, number?, boolean?];

data = ["test"];              // ✅ OK
data = ["test", 42];          // ✅ OK
data = ["test", 42, true];    // ✅ OK

console.log(data);

Output:

["test", 42, true]

🔹 Rest Elements in Tuples

Use rest syntax for variable-length tuples:

// First element is string, rest are numbers
let scores: [string, ...number[]];

scores = ["Math", 95, 87, 92];           // ✅ OK
scores = ["Science", 88];                // ✅ OK
scores = ["English", 90, 85, 92, 88];    // ✅ OK

console.log(scores[0]);  // "Math"
console.log(scores[1]);  // 95

// Another example: name and multiple phone numbers
let contact: [string, ...string[]];
contact = ["Alice", "555-1234", "555-5678"];

console.log(contact);

Output:

Math

95

["Alice", "555-1234", "555-5678"]

🔹 Destructuring Tuples

Extract tuple values into variables:

// Tuple destructuring
let person: [string, number, string] = ["Alice", 25, "Engineer"];

// Extract values
let [name, age, job] = person;

console.log(name);  // "Alice"
console.log(age);   // 25
console.log(job);   // "Engineer"

// Skip elements
let [firstName, , occupation] = person;
console.log(firstName);   // "Alice"
console.log(occupation);  // "Engineer"

// Function returning tuple
function getUser(): [string, number] {
    return ["Bob", 30];
}

let [userName, userAge] = getUser();
console.log(`${userName} is ${userAge} years old`);

Output:

Alice

25

Engineer

Alice

Engineer

Bob is 30 years old

🔹 Practical Examples

Real-world tuple usage:

Example 1: RGB Color

// RGB color as tuple
type RGB = [number, number, number];

let red: RGB = [255, 0, 0];
let green: RGB = [0, 255, 0];
let blue: RGB = [0, 0, 255];

function displayColor(color: RGB): string {
    return `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
}

console.log(displayColor(red));    // rgb(255, 0, 0)
console.log(displayColor(green));  // rgb(0, 255, 0)

Example 2: API Response

// API response: [status, data, error]
type APIResponse = [number, string, string?];

function fetchData(): APIResponse {
    // Simulate successful response
    return [200, "Success", undefined];
}

let [status, message, error] = fetchData();
console.log(`Status: ${status}, Message: ${message}`);

Output:

rgb(255, 0, 0)

rgb(0, 255, 0)

Status: 200, Message: Success

🔹 When to Use Tuples

✅ Use Tuples When:

  • You need a fixed number of elements
  • Each position has a specific meaning
  • Elements have different types
  • Order matters (coordinates, RGB values)
  • Returning multiple values from functions

❌ Use Arrays When:

  • All elements have the same type
  • Length can vary
  • Order doesn't define meaning
  • You need array methods like map, filter

🧠 Test Your Knowledge

What makes tuples different from arrays?