Массивы TypeScript
В TypeScript есть особый синтаксис для указания типа массива: напишите тип элемента, а после него [].
Если массивы для вас в новинку, сначала прочитайте про массивы в JavaScript.
Пример
names имеет тип string[], поэтому он принимает строки, но добавление числа было бы ошибкой.
Prompt
Покажите синтаксис типизации массива строк.
Объявите пустую константу
names с типом string[], добавьте в неё "Dylan" (без ошибки) и оставьте закомментированную строку names.push(3) с комментарием, поясняющим, что она вызвала бы ошибку, потому что число нельзя присвоить типу string. Ничего не выводится.
Вывод: программа на TypeScript и захваченный вывод
script.ts
const names: string[] = [];
names.push("Dylan"); // без ошибки
// names.push(3); // Ошибка: Argument of type 'number' is not assignable to parameter of type 'string'.
Readonly
Ключевое слово readonly запрещает изменять массив после его создания.
Пример
Так как names имеет тип readonly string[], у него нет методов, которые его изменяют, например push — вызов такого метода приводит к ошибке компиляции.
Prompt
Покажите, что модификатор
readonly запрещает изменять массив.
Объявите names с типом readonly string[] со значением ["Dylan"], затем вызовите names.push("Jack") — компилятор должен сообщить "Property 'push' does not exist on type 'readonly string[]'". Добавьте комментарий, предлагающий читателю убрать readonly и попробовать снова.
Вывод: программа на TypeScript и захваченный вывод
script.ts
const names: readonly string[] = ["Dylan"];
names.push("Jack"); // Ошибка: Property 'push' does not exist on type 'readonly string[]'.
// попробуйте убрать модификатор readonly — заработает ли тогда?
Вывод типов
Если при создании массива в нём уже есть значения, TypeScript может вывести (определить) его тип по ним.
Пример
Для numbers выводится тип number[]. Добавить ещё одно число можно, а добавить строку — ошибка; чтение numbers[0] даёт значение типа number.
Prompt
Покажите, как TypeScript выводит тип
number[] для литерала массива и следит за его соблюдением.
Объявите numbers = [1, 2, 3] без аннотации типа, добавьте 4 (без ошибки), затем добавьте строку "2" — эта строка должна вызвать ошибку "Argument of type 'string' is not assignable to parameter of type 'number'". Наконец, присвойте numbers[0] переменной head типа number (без ошибки).
Вывод: программа на TypeScript и захваченный вывод
script.ts
const numbers = [1, 2, 3]; // выведен тип number[]
numbers.push(4); // без ошибки
// закомментируйте строку ниже, чтобы увидеть успешное присваивание
numbers.push("2"); // Ошибка: Argument of type 'string' is not assignable to parameter of type 'number'.
let head: number = numbers[0]; // без ошибки