Свойства только для чтения
Некоторые свойства не должны меняться после создания объекта: имя героя, номер предмета. Пометьте их словом readonly:
type Hero = { readonly name: string; health: number };
const kira: Hero = { name: "Кира", health: 50 };
kira.health = 40;
kira.name = "Бруно";main.ts(5,6): error TS2540: Cannot assign to 'name' because it is a read-only property.health может меняться, поэтому строка 4 в порядке. name — нет: Cannot assign to 'name' because it is a read-only property. Читать его, выводить и передавать в функцию по-прежнему можно. Значение задаётся один раз — при создании объекта.
Чем это отличается от const? const защищает переменную: в kira всегда должен лежать один и тот же объект. А вот свойства объекта по-прежнему можно менять. Вы, возможно, помните по курсу JavaScript, что так можно:
const kira = { name: "Кира", health: 50 };
kira.name = "Бруно";
console.log(kira);Программа выведет:
{ name: "Бруно", health: 50 }readonly защищает одно свойство, в какой бы переменной ни лежал объект, — даже созданной через let, — а также внутри функций, которые получают объект как аргумент.
Как и любой тип, readonly проверяет только TypeScript, а из JavaScript, который выполняется, он исчезает. Во время выполнения ничто не помешало бы изменению. Но программа с таким изменением не запустится, потому что TypeScript сообщит о нём раньше.
Типичные ошибки:
constвместоreadonlyв типе:{ const name: string }даёт';' expected.В типе нужно словоreadonly.- Изменение свойства через
+=или++— тоже изменение.kira.name += "!"даёт ту же ошибку, что иkira.name = "Бруно".
Задание
- 1
Имя меняться не должно. Сделайте
nameсвойством только для чтения. Тогда TypeScript покажет строку вlevelUp, которая меняет имя: удалите её, ведь уровень уже хранится вlevel. Программа выведетКира, уровень 4. - 2
У каждого героя гильдии есть номер, который никогда не меняется. Добавьте в
Heroсвойствоidтипаnumber, доступное только для чтения. Тогда TypeScript сообщит о Кире, у которой нет номера: дайте ей номер7. - 3
В конце программы выведите строку ниже, используя
kira.id,kira.nameиkira.level:№7 Кира, уровень 4