Массивы
У массивов тоже есть типы. Массив строк имеет тип string[] (читается «массив строк»), массив чисел — number[]: тип элементов и за ним квадратные скобки. Обычно TypeScript выводит его по элементам:
const inventory = ["Лечебное зелье", "Серебряный меч"]; // string[]
const prices = [15, 45]; // number[]По типу TypeScript знает две вещи. Каждый элемент inventory — это string, поэтому inventory[0].toUpperCase() допустимо. И добавлять можно только строки:
const inventory = ["Лечебное зелье", "Серебряный меч"];
inventory.push(20);main.ts(2,16): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.push — это метод, функция, принадлежащая массиву, а 20 — её аргумент, значение в скобках. Аргумент попадает в параметр метода, и для массива строк у этого параметра тип string. Число сюда не подходит.
Тип массива можно написать и как аннотацию: const prices: number[] = [15, 45];. Когда есть элементы, она не нужна. Она нужна для пустого массива. По [] TypeScript не может понять, что в него будут класть, поэтому пытается вывести это из того, что программа добавляет, и пропускает всё:
const loot = [];
loot.push("Золотое кольцо");
loot.push(5);
console.log(loot);Эта программа запускается без ошибки и выводит ["Золотое кольцо", 5]. В других программах TypeScript вместо этого сдаётся и сообщает Variable 'loot' implicitly has type 'any[]' in some locations where its type cannot be determined. (Про any вы узнаете в конце этого урока.) Поэтому пустому массиву нужно задать тип:
const loot: string[] = [];
loot.push("Золотое кольцо");
loot.push(5);main.ts(3,11): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.Типичная ошибка: const loot: [] = [];. Тип [] без ничего перед ним означает массив, который всегда пуст, поэтому ничего добавить в него нельзя: Argument of type '"Золотое кольцо"' is not assignable to parameter of type 'never'. (never — тип, у которого вообще нет значений.) Напишите тип элементов перед скобками: string[].
Задание
- 1
Кира нашла 20 стрел, но в инвентаре лежат названия предметов, поэтому TypeScript не пускает туда число. Замените
20строкой"Стрелы", чтобы программа вывела:["Лечебное зелье", "Серебряный меч", "Старый ключ", "Стрелы"] - 2
Кира открывает сундук. В конце программы создайте пустой массив
lootдля названий предметов в сундуке с типомstring[]. - 3
Добавьте в
lootстроки"Золотое кольцо"и"Чешуя дракона"и выведите массив, чтобы программа вывела ещё и:["Золотое кольцо", "Чешуя дракона"]