/
Программирование
/
Курс Typescript
/

Многомерные массивы

Typescript: Многомерные массивы

В этом уроке мы рассмотрим многомерные массивы.

Работа с многомерными массивами

Чтобы определить многомерные массивы, нужно использовать синтаксис Type[][]. Дословно это означает, что перед нами массив, который содержит массивы со значениями типа Type. Несколько примеров:

// Тип number[][] выводится автоматически
const items1 = [
  [3, 8],
  [10, 4, 8],
];

const items2: number[][] = [];
// Или так — Array<number[]>

// Используем псевдоним
type User = {
  name: string;
};

// Или так — Array<User[]>
const users: User[][] = [[{ name: "Eva" }, { name: "Adam" }]];

Добавление не массивов в такие массивы приведет к ошибке типизации:

items1.push(99); // Error: Type 'number' is not assignable

Чтобы определить массивы составных типов, нужно использовать скобки:

const coll: (string | number)[][] = [];
coll.push(["hexlet", 5]);

Также можно использовать синтаксис Array<Array<Type>>. В примере ниже массив, внутри которого находятся массивы, содержащие значения типа Type:

const coll: Array<Array<string | number>> = [];
coll.push(["hexlet", 5]);

Сами массивы при этом могут быть частью объекта. Технически это позволяет создавать бесконечную вложенность из объектов и массивов:

type Course = {
  name: string;
  lessons: Lesson[];
};

type Lesson = {
  name: string;
  links: string[];
};

Здесь мы определяем тип Course, который содержит массив lessons. Каждый элемент этого массива — это объект типа Lesson, который содержит массив links. Каждый элемент этого массива — это строка. Такая структура данных может быть полезна, например, для хранения информации о курсах на сайте.

Создание массива нужной длины

Запись Array<Type> встречается в двух разных ролях. Выше мы использовали ее как аннотацию типа, но Array — это еще и конструктор. Если вызвать его с одним числом, получится массив такой длины, а тип элементов задается в угловых скобках:

// Массив длины 3, его тип — null[]
const empty = Array<null>(3);

Есть подвох: элементы такого массива не просто равны null — их вообще нет. Массив получается «дырявым», и методы вроде map() такие пустые слоты пропускают:

console.log(empty.map(() => 0)); // [<3 empty items>]

Чтобы этого не происходило, массив сначала заполняют методом fill(), и только потом вызывают map():

const zeros = Array<null>(3)
  .fill(null)
  .map(() => 0);
console.log(zeros); // [0, 0, 0]

Так же собирается и многомерный массив. Внешний массив заполняем, а затем на каждой позиции создаем новый массив:

const grid = Array<null>(2)
  .fill(null)
  .map(() => Array<null>(2).fill(null));
console.log(grid); // [[null, null], [null, null]]

Задание

Реализуйте функцию getField(), которая генерирует игровое поле для крестиков ноликов. Функция принимает на вход размерность поля и возвращает массив массивов нужного размера, заполненный значениями null.

const field1 = getField(1);
console.log(field1);
// [[null]]

const field2 = getField(2);
console.log(field2);
// [[null, null], [null, null]]

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются