Readonly массивы

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

Тренажер по TypeScript

В TypeScript часто важно гарантировать, что массив не будет изменен после создания. Для этого существуют Readonly массивы. Они предотвращают добавление, удаление или изменение элементов по индексу.

Объявить такой массив можно двумя способами: используя тип readonly Type[] или дженерик ReadonlyArray. Попытка вызвать методы мутации, такие как push, pop или splice, приведет к ошибке компиляции. Это способствует написанию более предсказуемого и функционального кода.

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

Список тем

1. Модификатор readonly

id: 40638_ts_readonly_arr_replace_01

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

Заполните пропуски
// Объявите массив координат как неизменяемый
let coordinates: input1S number[] = [10, 20, 30];
// Теперь массив coordinates нельзя изменять
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Разрешенные и запрещенные методы

id: 40638_ts_readonly_arr_sort_02

Перед вами список методов и свойств, которые используются при работе с массивами в TypeScript. Ваша задача — распределить их по двум категориям: 'Разрешено для Readonly массивов' и 'Запрещено (изменяющие)'. Обратите внимание, что ReadonlyArray в TypeScript предназначен для представления массивов, которые нельзя изменять после создания. Поэтому методы, изменяющие исходный массив, для него недопустимы.

Перетяните элементы в соответствующие блоки
Разрешено для Readonly
Запрещено (изменяющие)
push
map
filter
splice
pop
length
Сообщения
Проверить
Показать подсказку

3. Попытка мутации

id: 40638_ts_readonly_arr_error_03

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

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

4. Выбор правильного типа

id: 40638_ts_readonly_arr_select_fill_04

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

Нужно правильно расставить в пропуски предложенные варианты
function sumArray(arr: input1S): number {
    let total = 0;
    for (let i = 0; i < arr.length; i++) {
        total += arr[i];
    }
    return total;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Чтение данных

id: 40638_ts_readonly_arr_give_result_05

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

Что должно получиться?
const scores: readonly number[] = [85, 92, 78, 95, 88];
const idx = 1;
console.log(scores[idx]);
Сообщения
Проверить
Показать подсказку

6. Безопасная функция

id: 40638_ts_readonly_arr_build_06

Из предложенных строк соберите корректную функцию на TypeScript, которая принимает readonly массив строк и выводит каждый элемент в консоль. Функция не должна изменять исходный массив. Лишние строки в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
function printArray(arr: readonly string[]): void {
    for (const item of arr) {
        console.log(item);
    }
}
    arr.push('new item');
function printArray(arr: string[]): void {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Синтаксис Generic Readonly

id: 40638_ts_readonly_arr_highlight_07

В данном задании вам нужно разметить синтаксис объявления Readonly массива в TypeScript. Обратите внимание на строку кода и выделите два элемента: имя типа-обертки (обобщённый тип, делающий массив доступным только для чтения) и тип содержимого массива (тип элементов, которые будут храниться внутри). Для разметки используйте доступные категории: «Тип-обёртка» и «Тип содержимого».

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
let a: {{ReadonlyArray~|~t1}}<{{number~|~t2}}>;
Тип-обёртка
Тип содержимого
Сообщения
Проверить
Показать подсказку

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

id: 40638_compiler

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

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