Модификатор readonly¶
Локальную переменную можно определить неизменяемой при помощи ключевого слова const
. Но как реализовать подобное поведение для полей класса? На данный вопрос как раз и призвана ответить текущая глава.
Модификатор readonly¶
В TypeScript существует модификатор, с помощью которого поле объекта помечается как “только для чтения”. Модификатор, запрещающий изменение значений полей объектов, указывается с помощью ключевого слова readonly
. Он применяется к полям как при их объявлении в классе, так и при их описании в интерфейсе.
1 2 3 4 5 6 7 |
|
Если при описании интерфейса поле было помечено как readonly
, то классам, реализующим этот интерфейс, не обязательно указывать модификатор readonly
. Но в таком случае значение поля будет изменяемым.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Это правило работает и в обратном направлении — поле, описанное в интерфейсе без указания модификатора readonly
, может быть помечено этим модификатором при реализации.
1 2 3 4 5 6 7 8 9 10 |
|
Модификатор readonly
, примененный к параметрам конструктора, заставляет компилятор расценивать их как поля класса.
1 2 3 4 5 6 7 8 9 |
|
Кроме того модификатор readonly
, примененный к параметрам конструктора, можно комбинировать с другими модификаторами доступа.
1 2 3 4 5 6 7 8 9 |
|
Полю, к которому применен модификатор readonly
, не обязательно присваивать значение в момент объявления. Но в таком случае присвоить ему значение можно будет только из конструктора класса, в котором это поле объявлено. Если полю был применён модификатор readonly
и не было присвоено значение, то такое поле, так же как и любое другое неинициализированное поле, будет иметь значение undefined
.
1 2 3 4 5 6 7 8 9 10 11 |
|
Попытка присвоить значение полю, к которому применен модификатор readonly
в месте, отличном от места объявления или конструктора класса, приведет к возникновению ошибки.
1 2 3 4 5 6 7 8 9 10 11 |
|
Не получится избежать возникновения ошибки и при попытке присвоить значение из конструктора класса-потомка (с условием, что потомок не переопределяет его).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Поле объекта, созданного с помощью литерала объекта, будет невозможно изменить, если в связанном с ним типе к этим полям применен модификатор readonly
.
1 2 3 4 5 6 7 |
|
Если полям, помеченным “только для чтения”, не указан тип, а присвоение примитивного значения происходит в месте объявления, то для таких полей вывод типов укажет принадлежность к литеральному типу.
1 2 3 4 5 6 7 8 9 10 |
|