Обычно массивы могут менять свой размер и содержать от нуля значений. Поэтому пустой массив как значение []
является валидным для массивов любого типа.
При этом иногда массивы выступают в качестве упрощенной версии объекта, где количество значений и их порядок строго определены. Например, с помощью такого массива можно представить точку на плоскости: [x, y]
.
Такие массивы нужны для экономии символов, когда приходится создавать много одинаковых данных, например, для тестирования.
В TypeScript подобные массивы называются кортежами, с которыми мы познакомимся в этом уроке.
У кортежей есть свой синтаксис определения. Например, рассмотрим представление точки:
const point: [number, number] = [1, 3]
// Можно поменять
const point[0] = 4;
// Обращение к несуществующему индексу приведет к ошибке
point[3]; // Error!
// Нельзя создать не совпадающий по типу
const point2: [number, number] = [1, 'x']; // Error!
Так как кортежи имеют фиксированное количество элементов, было бы логично, если бы такое же поведение применялось к push()
или pop()
. Ведь если мы определили кортеж из двух элементов, то элементов должно быть именно два.
На практике код ниже сработает:
point.push(10);
console.log(point); // [4, 3, 10];
Такое поведения сохраняется для обратной совместимости. И общая рекомендация состоит в том, чтобы не пытаться изменять размер кортежа.
Кортежи могут состоять из элементов разных типов:
type HTTPResponse = [number, string];
// Порядок определения важен
const response: HTTPResponse = [404, 'Page is not found'];
// Так не сработает ['Page is not found', 404]
Часть из них может быть опциональная. В таком случае опциональные элементы должны быть в конце кортежа:
type HTTPResponse = [number, string?];
const response1: HTTPResponse = [500];
const response2: HTTPResponse = [201, 'Created'];
В примере выше первый элемент массива всегда должен быть числом, а второй — строкой или может отсутствовать.
Если создавать переменные для кортежей и использовать псевдоним, то его нужно указывать явно. Иначе с точки зрения TypeScript будет создан обычный массив:
// Будет иметь тип (string | number)[]
const response = [201, 'Created'];
Создайте и экспортируйте тип Point
, который описывает точку в пространстве, состоящую из трех координат: x, y, z.
Реализуйте функцию isTheSamePoint()
, которая проверяет две точки на их одинаковое расположение. Две точки совпадают, если совпадают все их координаты:
const p1: Point = [1, 3, 4];
const p2: Point = [1, 3, 4];
const p3: Point = [0, 8, 4];
isTheSamePoint(p1, p2); // true
isTheSamePoint(p1, p3); // false
isTheSamePoint(p2, p3); // false
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт
Ваше упражнение проверяется по этим тестам
1import { expect, test } from 'vitest'
2import isTheSamePoint, { Point } from './index';
3
4test('function', () => {
5 const p1: Point = [1, 2, 3];
6 const p2: Point = [1, 2, 3];
7 const p3: Point = [0, 2, 3];
8 const p4: Point = [1, 21, 3];
9 const p5: Point = [1, 2, 13];
10
11 expect(isTheSamePoint(p1, p2)).toBe(true);
12 expect(isTheSamePoint(p1, p3)).toBe(false);
13 expect(isTheSamePoint(p4, p5)).toBe(false);
14});
15
Решение учителя откроется через: