Итоги
В этом уроке вы узнали, что:
- размеченное объединение — это объединение типов объектов с общим свойством-тегом, например
kind, у которого в каждом типе свой литеральный тип:type Item = { kind: "potion"; heal: number } | { kind: "weapon"; damage: number };. Проверка тега,if (item.kind === "potion"), сужает тип. TypeScript проверяет свойства каждого вида и замечает опечатки в видах. switch (item.kind)переходит кcaseс тем же значением;breakилиreturnзавершает его, а без них программа проваливается в следующий вариант.defaultловит остальное. Каждыйcaseсужает тип.- Проверка полноты в
default,const unhandled: never = item; return unhandled;, заставляет TypeScript сообщать о каждомswitch, в котором нет варианта для какого-то вида, и называет этот вид.never— тип, у которого нет значений. Record<Rarity, number>— объект ровно с ключами изRarityи числом для каждого из них. Пропущенный ключ — ошибка, аprices[item.rarity]читает значение.const classes = ["warrior", "mage"] as const;— список точных значений только для чтения, аtype HeroClass = (typeof classes)[number];превращает его в объединение, так что список и тип всегда совпадают.- Размеченное объединение может описывать и состояния одной вещи, у каждого из которых свои данные: только у квеста со
status: "done"есть свойствоreward. - Вместо
booleanс необязательными свойствами пишите объединение, чтобы невозможные сочетания нельзя было записать. Тегом может быть иboolean:{ isLocked: false } | { isLocked: true; keyName: string }.
Дальше вас ждёт ещё один небольшой проект: книга заказов кузнеца, в которой вы самостоятельно примените типы объектов, объединения и размеченные объединения. А затем в уроке «Обобщения» вы научитесь писать функции и типы, которые работают с любым типом, а TypeScript по-прежнему следит, какой это тип: функцию, возвращающую первый элемент любого массива, или сундук, в котором может лежать любая добыча. И увидите, как работают типы с угловыми скобками, такие как Record.
А теперь практика. Путешествие Киры в редакторе — это список встреч: боёв, сокровищ и привалов.
Задание
- 1
Запустите программу: проверка полноты сообщает о виде без варианта. Добавьте его: для привала
describeEncounterвозвращаетКира отдыхает у костра. Программа выведет:Кира в бою: волк (+20 XP) Кира нашла золото: 35 Кира отдыхает у костра Кира в бою: гоблин (+15 XP) - 2
Под циклом создайте
const counts: Record<"fight" | "treasure" | "rest", number>со всеми счётчиками, равными0, и подсчитайте в нём встречи каждого вида. - 3
Также сложите XP за бои и золото из сокровищ. В конце выведите счётчики и суммы:
Кира в бою: волк (+20 XP) Кира нашла золото: 35 Кира отдыхает у костра Кира в бою: гоблин (+15 XP) Боёв: 2, сокровищ: 1, привалов: 1 XP: 35, золото: 35