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]]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]]Ваше упражнение проверяется по этим тестам
import { expect, test } from "vitest";
import getField from "./index";
test("function", () => {
expect(getField(1)).toEqual([[null]]);
expect(getField(2)).toEqual([
[null, null],
[null, null],
]);
expect(getField(3)).toEqual([
[null, null, null],
[null, null, null],
[null, null, null],
]);
});Решение учителя откроется через:
20:00
