Массивоподобные readonly типы, ReadonlyArray, ReadonlyMap, ReadonlySet¶
Чем меньше шансов случайного изменения значений, определенных в объектных типах, тем больше программа защищена от ошибок во время выполнения. Очередным шагом в этом направлении стали неизменяемые массивоподобные типы ReadonlyArray<T>
, ReadonlyMap<K, V>
, ReadonlySet<T>
, а также механизм указания модификатора readonly
в аннотации типа.
Массивоподобные readonly типы (модифицировать непосредственно в аннотации типа)¶
TypeScript реализует механизм, позволяющий определять массивы и кортежи как неизменяемые структуры данных. Для этого к типу, указанному в аннотации типа, добавляется модификатор readonly
.
1 2 |
|
Элементы массивоподобных структур, определенных как readonly
, невозможно заменить или удалить. Кроме того, в подобные структуры невозможно добавить новые элементы. Иными словами, у массивоподобных readonly
типов отсутствуют признаки, предназначенные для изменения их содержимого.
В случае объявления readonly
массива становится невозможно изменить его элементы с помощью индексной сигнатуры (array[...]
)
1 2 3 |
|
Помимо этого, у readonly
массива отсутствуют методы, с помощью которых можно изменить элементы массива.
1 2 3 4 5 6 |
|
С учетом погрешности на известные различия между массивом и кортежем, справедливо утверждать, что правила для readonly
массива справедливы и для readonly
кортежа. Помимо того, что невозможно изменить или удалить слоты кортежа, он также теряет признаки массива, которые способны привести к его изменению.
1 2 3 4 5 6 7 8 |
|
Также не будет лишним упомянуть, что массив или кортеж, указанный в аннотации с помощью расширенного типа Readonly<T>
, расценивается выводом типов как помеченный модификатором readonly
.
1 2 3 4 5 |
|
Благодаря данному механизму в сочетании с механизмом множественного распространения (spread
), становится возможным типизировать сложные сценарии, одним из которых является реализация известной всем функции concat
, способной объединить не только массивы, но и кортежи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Напоследок стоит упомянуть, что вывод типов расценивает readonly
массив как принадлежащий к интерфейсу ReadonlyArray<T>
, речь о котором пойдет далее.
ReadonlyArray (неизменяемый массив)¶
Расширенный тип ReadonlyArray<T>
предназначен для создания неизменяемых массивов. ReadonlyArray<T>
запрещает изменять значения массива, используя индексную сигнатуру array[n]
.
1 2 3 4 |
|
Кроме того, тип ReadonlyArray<T>
не содержит методы, способные изменить, удалить или добавить элементы.
1 2 3 4 5 6 |
|
ReadonlyMap (неизменяемая карта)¶
Расширенный тип ReadonlyMap<K, V>
, в отличие от своего полноценного прототипа, не имеет методов, способных его изменить.
1 2 3 |
|
ReadonlySet (неизменяемое множество)¶
Аналогично другим структурам данных, предназначенных только для чтения, расширенный тип ReadonlySet<T>
не имеет методов, способных его изменить.
1 |
|