Массивы определяются с помощью выражения []
и также являются строго типизированными. То есть если изначально массив
содержит строки, то в будущем он сможет работать только со строками.
let list: number[] = [10, 20, 30]; let colors: string[] = ["red", "green", "blue"]; console.log(list[0]); console.log(colors[1]);
Как и в JavaScript, с помощью индексов можно обращаться к элементам массива.
Альтернативный способ определения массивов представляет применение типа Array<>
, где в фигурных скобках указывается тип элементов массива:
let names: Array<string> = ["Tom", "Bob", "Alice"]; console.log(names[1]); // Bob
Но фактически такие формы массивов, как number[]
или string[]
являются сокращением соответственно типов
Array<number>
или Array<string>
В остальном массивы в TypeScript поддерживают все те же операции, что и массивы в JavaScript.
Массивы позволяют изменять значения своих элементов:
const people = ["Tom", "Bob", "Sam"]; people[1] = "Kate"; console.log(people[1]); // Kate
Но TypeScript также позволяет определять массивы, элементы которых нельзя изменять. Для этого применяется тип ReadonlyArray<>, для которого в угловых скобках указывается тип элементов массива.
В отличие от типа Array
для типа ReadonlyArray
мы не можем принимать конструктор, как в следующем случае:
const people: ReadonlyArray<string> = new ReadonlyArray("Tom", "Bob", "Sam");
Вместо этого необходимо передать значения в виде обычного массива:
const people: ReadonlyArray<string> = ["Tom", "Bob", "Sam"];
Для определения подобных массивов также можно использовать сокращение типа - readonly Тип_данных[]
:
const people: readonly string[]= ["Tom", "Bob", "Sam"];
Массив ReadonlyArray поддерживаtт большинство тех же операций, что и обычные массивы, за тем исключением операций, которые изменяют массив и его элементы. Так, мы не можем менять отдельные значения:
const people: ReadonlyArray<string> = ["Tom", "Bob", "Sam"]; people[1] = "Kate"; // ! Ошибка элементы массива ReadonlyArray нельзя изменить
Также мы не можем добавлять новые или удалять уже имеющиеся элементы:
const people: ReadonlyArray<string> = ["Tom", "Bob", "Sam"]; people.push("Kate"); // ! Ошибка - нельзя добавить новые элементы people.pop(); // ! Ошибка - нельзя удалить существующие элементы
Более того при компиляции компилятор сообщит нам, что для типа ReadonlyArray не определены методы push()
и pop()
.
Это относится ко всем операциям, которые изменяют массив.
Все остальные операции, которые предусматривают чтение массива, мы по прежнему можем использовать:
function printUsers(users: readonly string[]) { for(const user of users){ console.log(user); } } function usersToString(users: ReadonlyArray<string>): String{ return users.join(", "); } const people: readonly string[]= ["Tom", "Bob", "Sam"]; printUsers(people); console.log(usersToString(people));
Как и в javascript, массивы поддерживают декомпозицию на константы и переменные. Например:
const people: string[]= ["Tom", "Bob", "Sam"]; const [first, second, third] = people; console.log(first); // Tom console.log(second); // Bob console.log(third); // Sam
Здесь массив people раскладывается на три константы - first, second, third. Значения массива передаются константам/переменным по позиции, то есть первой константе - первый элемент массива, второй константе - второй элемент и так далее. Причем констант/переменных не больше, чем элементов массива.
С помощью оператора ... можно указать массив, в который будут помещаться все оставшиеся элементы раскладываемого массива, которые не вошли в предыдущие переменные/константы:
const people: string[]= ["Tom", "Bob", "Sam"]; const [first, ...rest] = people; console.log(first); // Tom console.log(rest[0]); // Bob console.log(rest[1]); // Sam
Здесь константа first
принимает первый элемент массива - "Tom". Все оставшиеся элементы кортежа будут помещаться в массив
rest
.
Также можно оставить пустое место вместо переменной/константы, если мы хотим пропустить соответствующий элемент массива:
const people: string[]= ["Tom", "Bob", "Sam", "Kate"]; const [, second, , forth] = people; // пропускаем первый и третий элементы массива console.log(second); // Bob console.log(forth); // Kate