Массивоподобные 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 | |