Readonly кортежи

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

По умолчанию массивы и кортежи в TypeScript изменяемы (mutable). Это значит, что вы можете менять элементы по индексу или использовать методы вроде push и pop. Однако часто требуется гарантировать неизменяемость данных.

Для этого используется модификатор readonly. Синтаксис: readonly [number, string].
Альтернативный способ создания неизменяемого кортежа «на лету» — использование as const.

Попытка изменить такой кортеж приведет к ошибке компиляции. Это важный инструмент для создания надежных и предсказуемых структур данных.

Список тем

1. Объявление Readonly

id: 40643_readonly_syntax_replace

В TypeScript для создания неизменяемых (immutable) кортежей используется модификатор `readonly`. В данном фрагменте кода объявлен тип `Point`, представляющий координаты точки как кортеж из двух чисел. Однако, без модификатора `readonly` элементы кортежа могут быть изменены после создания, что противоречит идее неизменяемости. Добавьте пропущенное ключевое слово в объявление типа, чтобы сделать кортеж неизменяемым и предотвратить изменение его элементов.

Заполните пропуски
// Объявление типа для координат точки
type Point = input1S [number, number];

const origin: Point = [0, 0];
// origin[0] = 1; // Ошибка: нельзя изменять элементы
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Попытка изменения

id: 40643_mutation_attempt_error

В этом фрагменте TypeScript-кода объявлен кортеж с модификатором readonly. Затем предпринимается попытка изменить значение первого элемента кортежа, что запрещено. Найдите строку с ошибкой и исправьте её, удалив или закомментировав.

Найдите ошибку и исправьте
const point: readonly [number, number] = [10, 20];
point[0] = 5;
console.log(point);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Использование as const

id: 40643_as_const_build

Из предложенных строк соберите корректную TypeScript-программу, которая создаёт кортеж с помощью утверждения `as const`, определяет тип элемента этого кортежа, объявляет переменную этого типа, выводит значение переменной и длину кортежа. Лишние строки, которые приводят к ошибкам компиляции или не соответствуют задаче, в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
const colors = ['red', 'green', 'blue'] as const;
type Color = typeof colors[number];
const firstColor: Color = colors[0];
console.log(firstColor);
console.log(colors.length);
colors[0] = 'yellow';
const anotherColor: Color = 'purple';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Mutable vs Immutable

id: 40643_sort_mutable_immutable

Перед вами список операций, которые можно выполнить над массивом или кортежем в TypeScript. Разнесите их по двум категориям: те, которые доступны для readonly кортежей (не изменяют исходный кортеж), и те, которые запрещены (изменяют кортеж). Обратите внимание, что readonly кортежи не могут быть изменены после создания. Каждый элемент должен оказаться в одной из категорий.

Перетяните элементы в соответствующие блоки
Запрещено для Readonly
Доступно для Readonly
tuple.push(5)
tuple.pop()
tuple.splice(0, 1)
tuple[0] = 5
tuple.map(x => x * 2)
tuple.slice(0, 2)
tuple.indexOf(5)
tuple.join(',')
Сообщения
Проверить
Показать подсказку

5. Аргументы функции

id: 40643_function_args_select_fill

В этом задании вам нужно выбрать правильные аннотации типов для параметров функции, чтобы гарантировать, что функция не будет изменять переданные ей аргументы. В коде TypeScript ниже два пропуска: для первого параметра (массив строк) и второго (кортеж из строки и числа). Выберите из выпадающих списков подходящие типы, используя варианты с модификатором `readonly`. Это упражнение поможет закрепить понимание работы с неизменяемыми структурами данных в TypeScript.

Нужно правильно расставить в пропуски предложенные варианты
function processData(arr: input1S, tup: input2S): void {
    // Эта функция не должна изменять arr и tup
    console.log(`Длина массива: ${arr.length}`);
    console.log(`Кортеж: ${tup[0]} - ${tup[1]}`);
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Результат компиляции

id: 40643_predict_compilation_fail

Проанализируйте приведённый фрагмент кода на TypeScript. Определите, будет ли этот код успешно скомпилирован. Выберите правильное объяснение результата компиляции, учитывая особенности работы с readonly кортежами.

Выберите правильный вариант ответа
const tuple: readonly [number, number, number] = [3, 1, 2];
tuple.sort();
console.log(tuple);
Сообщения
Проверить
Показать подсказку

7. Безопасное обновление

id: 40643_sequencing_safe_update

Перед вами строки TypeScript-кода, которые выполняют безопасное обновление readonly кортежа. Исходный кортеж объявлен как readonly, поэтому его нельзя изменить напрямую. Необходимо расставить строки в правильном порядке, чтобы получить новый кортеж с обновлённым значением. В результате должен получиться корректный код, который сначала деструктурирует исходный кортеж, затем изменяет одно из значений и создаёт новый readonly кортеж.

Расставьте строки в правильном порядке
const newStr = str + "!";
const original: readonly [number, string] = [1, "old"];
const [num, str] = original;
const updated: readonly [number, string] = [num, newStr];
Сообщения
Проверить
Показать подсказку

8. Мутирующие методы

id: 40643_click_mutating_methods

В данном фрагменте кода TypeScript объявлен readonly кортеж. Ниже приведены вызовы различных методов для этого кортежа. Ваша задача — отметить (кликнуть) только те вызовы методов, которые вызовут ошибку компиляции из-за того, что они пытаются изменить (мутировать) readonly кортеж. Не отмечайте вызовы методов, которые не изменяют кортеж и, следовательно, разрешены для readonly.

Кликните по всем фрагментам, которые подходят под условие задания.
const tuple: readonly [number, string, boolean] = [1, "hello", true];

// Вызовы методов:
{{tuple.push(4);~|~t1}}
{{tuple.splice(0, 1);~|~t2}}
{{tuple.concat([2, "world"]);~|~t3}}
{{tuple.filter(x => true);~|~t4}}
{{tuple.pop();~|~t5}}
{{tuple.reverse();~|~t6}}
{{tuple.map(x => x);~|~t7}}
{{tuple.slice(0, 2);~|~t8}}
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40643_compiler

Этот пример показывает, как работают readonly-кортежи в TypeScript: их можно безопасно читать, но нельзя изменять (ни по индексу, ни через push). Попробуйте менять исходные координаты, добавлять новые функции (например, distanceToOrigin) и посмотрите, что компилятор разрешает, а что запрещает. Затем раскомментируйте «неправильные» строки, чтобы увидеть типовые ошибки при попытке мутировать readonly-кортеж. Для контраста есть функция, которая мутирует обычный кортеж — попробуйте передать туда readonly и убедитесь, что TypeScript не даст это сделать.

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру