Использование предметов
Предметы нужны, чтобы их использовать: зелье лечит Киру, оружие она берёт в руку, а ключ что-то открывает. Использование предмета меняет героя, поэтому функция получает его параметром и изменяет его свойства. Объекты при передаче в функцию не копируются, так что изменения происходят в самой kira.
Где Кира будет держать оружие в руке? В новом свойстве weapon. В начале приключения рука пуста, поэтому свойство необязательное, как в уроке «Типы объектов»: weapon?: Weapon. Например, следопыт и её питомец:
type Pet = { name: string; species: string };
interface Ranger {
name: string;
pet?: Pet;
}
function adopt(ranger: Ranger, pet: Pet): string {
ranger.pet = pet;
return `${ranger.name} берёт к себе питомца: ${pet.name} (${pet.species})`;
}
const ema: Ranger = { name: "Эма" };
console.log(ema.pet?.name ?? "нет питомца");
console.log(adopt(ema, { name: "Тень", species: "волк" }));
console.log(ema.pet?.name ?? "нет питомца");Это выведет:
нет питомца
Эма берёт к себе питомца: Тень (волк)
ТеньuseItem — это switch по item.kind, как describeItem, но в некоторых его ветках сначала меняется герой, и только потом возвращается текст:
- Зелье прибавляет
item.healк здоровью. Если получилось большеmaxHealth, здоровью присваиваетсяmaxHealth: у Киры здоровье 34, зелье лечит на 20, а 54 — больше её 50. - Оружие попадает в руку:
hero.weapon = item;. Это работает только внутриcase "weapon", где TypeScript знает, что предмет — этоWeapon. Надswitchпредмет мог бы быть любого вида, и TypeScript сообщил бы:main.ts(46,5): error TS2322: Type 'Item' is not assignable to type 'Weapon | undefined'. Property 'damage' is missing in type 'Key' but required in type 'Weapon'. - Ключ ничего не меняет, он только возвращает
Кира открывает склеп.
Напишите тип возврата string и здесь. Тогда TypeScript проверит, что каждая ветка case возвращает текст. А как вы увидите на последнем шаге, он сообщит и о виде предмета без case, даже без проверки с never: функция закончилась бы, не вернув текст.
В основной программе kira.inventory[0] — первый предмет (зелье), а kira.inventory[1] — второй (меч). Свойство name у Киры только для чтения, но это не мешает: useItem его только читает.
Задание
- 1
Добавьте в
Heroнеобязательное свойствоweaponтипаWeapon. - 2
Под
describeItemнапишите функциюuseItem(hero: Hero, item: Item): stringсswitchпоitem.kind. Для зелья она возвращаетКира пьёт «Целебное зелье»: здоровье 50/50(имя героя, название предмета и новое здоровье), для оружия —Кира берёт в руку «Серебряный меч», а для ключа —Кира открывает склеп. - 3
В конце основной программы Кира использует два первых предмета: выведите
useItem(kira, kira.inventory[0])иuseItem(kira, kira.inventory[1]). Программа заканчивается так:- Старый ключ (открывает склеп) Кира пьёт «Целебное зелье»: здоровье 50/50 Кира берёт в руку «Серебряный меч»Если у Киры
54/50, зелье вылечило её выше максимума.