Вложенные объекты
Свойство может содержать другой объект. У героя есть позиция на карте — x и y. Тип такого свойства — тоже тип объекта:
type Hero = {
name: string;
position: { x: number; y: number };
};
const kira: Hero = { name: "Кира", position: { x: 3, y: 4 } };
kira.position.x = kira.position.x + 1;
console.log(kira);
console.log(kira.position.x);Программа выведет:
{ name: "Кира", position: { x: 4, y: 4 } }
4Читайте kira.position.x слева направо: из kira берём position — объект с x и y, а из него — x, число. TypeScript проверяет внутренний объект так же тщательно, как внешний.
Обычно лучше дать внутреннему типу собственное имя. Типы становятся короче, позицию можно использовать и в других местах (она есть и у монстра, и у сокровища), а сообщения об ошибках становятся понятнее. Сравните одну и ту же ошибку — позицию без y — сначала с типом, записанным прямо внутри Hero:
type Hero = { name: string; position: { x: number; y: number } };
const kira: Hero = { name: "Кира", position: { x: 3 } };main.ts(3,36): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type '{ x: number; y: number; }'.а затем с отдельным типом Position:
type Position = { x: number; y: number };
type Hero = { name: string; position: Position };
const kira: Hero = { name: "Кира", position: { x: 3 } };main.ts(4,36): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type 'Position'.Обратите внимание и на столбец. Он указывает на position — свойство с внутренним объектом, а не на начало kira. Если что-то не так глубоко внутри объекта, TypeScript показывает, где именно. О чтении свойства, которого нет, сообщается с именем внутреннего типа:
type Position = { x: number; y: number };
type Hero = { name: string; position: Position };
const kira: Hero = { name: "Кира", position: { x: 3, y: 4 } };
console.log(kira.position.z);main.ts(5,27): error TS2339: Property 'z' does not exist on type 'Position'.Свойство может содержать и массив. Инвентарь героя может быть inventory: string[] — список названий предметов, или, с типом Item, inventory: Item[] — список целых объектов. Всё, что вы знаете о массивах и объектах, работает и здесь: kira.inventory.push("верёвка"), kira.inventory.length или цикл for...of по kira.inventory.
Задание
- 1
Создайте тип
Weaponдля оружия Киры со свойствамиnameтипаstringиdamageтипаnumber. - 2
Создайте тип
Heroсо свойствамиname(string),position(Position) иweapon(Weapon) и аннотируйте имkira. - 3
Кира идёт на восток: в конце программы увеличьте
kira.position.xна 3. Затем выведите строку ниже, используя значения изkira.position:Кира стоит в точке 5, 5 - 4
В сундуке Кира находит лук получше. Положите в
kira.weaponновый объект оружия: Эльфийский лук с уроном 12. Затем выведите строку ниже, используя значения изkira.weapon:Кира: Эльфийский лук (урон 12)