Отчёт
В конце приключения — отчёт: сколько квестов выполнено, активно и провалено, и золото Киры с наградами за выполненные квесты.
Для подсчёта нужно число для каждого статуса: объект с одним ключом на статус, а для этого и нужен Record из урока «Моделирование данных». Статусы не придётся писать заново: Quest["status"] из предыдущего урока — это объединение их всех. Например, монстры в пещере, подсчитанные по виду:
type Monster = { kind: "goblin" | "wolf" | "troll"; name: string };
const cave: Monster[] = [
{ kind: "goblin", name: "Грызь" },
{ kind: "wolf", name: "Серый" },
{ kind: "goblin", name: "Заноза" },
];
const counts: Record<Monster["kind"], number> = { goblin: 0, wolf: 0, troll: 0 };
for (const monster of cave) {
counts[monster.kind]++;
}
console.log(counts);
console.log(`Гоблинов: ${counts.goblin}`);Это выведет:
{ goblin: 2, wolf: 1, troll: 0 }
Гоблинов: 2counts[monster.kind] использует вид как ключ, так что каждый монстр прибавляет единицу к своему счётчику. TypeScript проверяет, что в объекте есть все ключи. В вашей программе без failed: 0 вы получили бы main.ts(122,7): error TS2741: Property 'failed' is missing in type '{ open: number; done: number; }' but required in type 'Record<"done" | "failed" | "open", number>'. А если в Quest когда-нибудь добавят новый статус, TypeScript сообщит и об этом объекте.
Теперь золото. Награда есть только у выполненного квеста, поэтому чтение quest.reward без проверки — ошибка:
main.ts(126,35): error TS2339: Property 'reward' does not exist on type 'Quest'.
Property 'reward' does not exist on type '{ status: "open"; title: string; }'.Внутри if (quest.status === "done") TypeScript сужает квест до выполненного, и quest.reward допустимо. Кира лежит в const, но золото ей менять всё равно можно: const означает лишь то, что переменная всегда хранит один и тот же объект.
Задание
- 1
В основной программе над циклом по квестам создайте константу
countsтипаRecord<Quest["status"], number>с0для каждого статуса. - 2
В цикле прибавьте единицу к счётчику статуса каждого квеста. После цикла выведите счётчики:
Выполнено: 2, активно: 1, провалено: 1 - 3
В том же цикле прибавляйте награду каждого выполненного квеста к золоту Киры. В самом конце ещё раз выведите строку о Кире. Программа заканчивается так:
Выполнено: 2, активно: 1, провалено: 1 Кира, следопыт, уровень 3, здоровье 50/50, золото 200Здоровье Киры — от зелья, а золото — от двух квестов. Если у неё всё ещё 120 золота, вы выводите её до цикла.