JS Tower
JavaScript & TypeScriptМодуль 7: Основы TypeScript

Массивы и кортежи

Типизация массивов и кортежей

Цель урока

В этом уроке ты научишься:

  • Типизировать массивы
  • Использовать кортежи
  • Применять readonly

Массивы

Синтаксис

// Способ 1: Type[]
let numbers: number[] = [1, 2, 3];
let names: string[] = ["Иван", "Мария"];

// Способ 2: Array<Type>
let numbers2: Array<number> = [1, 2, 3];
let names2: Array<string> = ["Иван", "Мария"];

Типизация элементов

let numbers: number[] = [1, 2, 3];

numbers.push(4);    // OK
// numbers.push("5"); // Ошибка!

let first: number = numbers[0]; // тип number

Массивы объектов

interface User {
  name: string;
  age: number;
}

let users: User[] = [
  { name: "Иван", age: 25 },
  { name: "Мария", age: 22 }
];

Кортежи (Tuples)

Массив фиксированной длины с разными типами:

// [string, number]
let tuple: [string, number] = ["Иван", 25];

let name: string = tuple[0]; // "Иван"
let age: number = tuple[1];  // 25

// tuple[2]; // Ошибка: доступ за пределы

Именованные кортежи

type Point = [x: number, y: number];
type RGB = [red: number, green: number, blue: number];

let point: Point = [10, 20];
let color: RGB = [255, 128, 0];

Опциональные элементы

type Point2D = [number, number];
type Point3D = [number, number, number?];

let point2d: Point2D = [1, 2];
let point3d: Point3D = [1, 2, 3];
let point3d2: Point3D = [1, 2]; // OK, z опционален

readonly

Массивы

let numbers: readonly number[] = [1, 2, 3];

// numbers.push(4);    // Ошибка!
// numbers[0] = 10;    // Ошибка!

let first = numbers[0]; // OK — чтение разрешено

Кортежи

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

// point[0] = 5; // Ошибка!

ReadonlyArray

let numbers: ReadonlyArray<number> = [1, 2, 3];

// То же самое, что readonly number[]

Деструктуризация

let tuple: [string, number, boolean] = ["Иван", 25, true];

let [name, age, active] = tuple;
// name: string, age: number, active: boolean

Практические примеры

// Функция возвращает кортеж
function getNameAndAge(): [string, number] {
  return ["Иван", 25];
}

let [name, age] = getNameAndAge();

// useState в React
function useState<T>(initial: T): [T, (value: T) => void] {
  let state = initial;
  const setState = (value: T) => { state = value; };
  return [state, setState];
}

Практика

Задание 1: Массив

Задача: Создай типизированный массив чисел.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
150

Задание 2: Кортеж

Задача: Создай кортеж для координат.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
10 20

Задание 3: Функция с кортежем

Задача: Создай функцию, возвращающую кортеж.

Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
3 1

Проверь себя

  1. Чем массив отличается от кортежа?
  2. Как сделать массив неизменяемым?
  3. Как типизировать массив объектов?