Объекты в TypeScript ведут себя особым образом. При объявлении объектов тип данных не указывается. Для примера сделаем объект с юзером, хранящий в себе его имя и возраст:
let user = {name: 'john', age: 30};
TypeScript сам понимает, что в переменной содержится объект и сам контролирует структуру этого объекта, предохраняя его от непредусмотренных изменений. Давайте разбираться подробнее.
Контроль типа переменной
TypeScript контролирует тип переменной с объектом, запрещая записывать в нее данные другого типа. Посмотрим на примере. Пусть у нас дан объект с юзером:
let user = {name: 'john', age: 30};
Попробуем записать в эту переменную данные другого типа, например, строку. Мы получим ошибку:
user = 'eric'; // ошибка
Контроль структуры объекта
TypeScript также контролирует структуру объекта. Пусть мы объявили наш объект с юзером:
let user = {name: 'john', age: 30};
В момент объявления TypeScript запоминает,
что в нашем объекте есть ключи name
и age
, а затем контролирует,
чтобы в переменной хранился объект
именно с этими ключами.
Попытка записать в переменную другой объект приводит к ошибке компиляции. Давайте попробуем. Запишем в переменную объект, в котором не хватает ключа:
user = {name: 'eric'}; // ошибка
Запишем в переменную объект, в котором лишний ключ:
user = {name: 'eric', age: 40, salary: 300}; // ошибка
А теперь запишем в переменную объект,
содержащий только ключи name
и age
:
user = {name: 'eric', age: 40}; // работает
Контроль типов значений
В момент объявления объекта TypeScript запоминает тип данных всех его элементов, а затем контролирует, чтобы эти типы не изменялись.
Посмотрим на примере нашего объекта с юзером. Объявим его:
let user = {name: 'john', age: 30};
После объявления TypeScript проанализировал
тип данных каждого значения и запомнил,
что в поле name
- строка,
а в поле age
- число.
Теперь попытка записать в поле значение другого типа закончится ошибкой.
Пример:
user.name = 123; // ошибка
Пример:
user.age = 'eee'; // ошибка
Пример:
user.age = '30'; // ошибка
Практические задачи
Не запуская код определите каким будет результат выполнения кода:
let date = {year: 2025, month: 12, day: 31};
date.isLeap = true;
console.log(date);
Не запуская код определите каким будет результат выполнения кода:
let date = {year: 2025, month: 12, day: 31};
date = {year: 2025, month: 12};
Не запуская код определите каким будет результат выполнения кода:
let date = {year: 2025, month: 12, day: 31};
date = {year: 2025, month: 12, date: 7};