Итоги
В этом уроке вы узнали, что:
- Объединение типов (union type) вроде
string | numberдопускает значение любого из своих типов. Без проверки можно делать только то, что работает для всех них:reward.toUpperCase()дляstring | number— ошибка. - Проверка сужает тип. Внутри
if (typeof reward === "string") { … }значениеreward— этоstring; в веткеelseи нижеif, который завершается через return, этоnumber. Массиву из объединения нужны скобки:(number | string)[]. - Объединение литералов вроде
type HeroClass = "воин" | "маг" | "следопыт";допускает только эти значения. TypeScript сообщает об опечатках в значениях, аргументах и сравнениях. Уletсо строкой типstring, поэтому задайте ему тип или используйтеconst. Вместоenumиспользуйте объединения литералов. nullиundefinedвходят в тип, только если вы сами их туда записали:Monster | null. Проверяйте такое значение, прежде чем использовать, например с помощьюif (target === null) { return; }; иначе TypeScript сообщит'target' is possibly 'null'.find()возвращает первый подходящий элемент илиundefined, если ничего не подошло. Его тип —Item | undefined: обработайте оба случая и задайте функции, которая ищет, тип возвращаемого значенияItem | undefined.hero.weapon?.nameчитаетname, только еслиhero.weaponсуществует, иначе даётundefined.value ?? "default"заменяетnullиundefined, но, в отличие от||, не заменяет0и"".Array.isArray(loot)отличает массив от одиночного значения, например вstring | string[]. Остерегайтесь того, что работает для обоих типов, напримерlengthиfor...of.unknownпринимает любое значение, но ничего не разрешает, пока вы не сузите тип, например с помощьюtypeof. Для данных извне используйте его вместоany."heal" in itemсужает объединение типов объектов по свойству. Защитник типа (type guard),function isPotion(item: Item): item is Potion, выносит такую проверку в функцию. TypeScript ей доверяет, поэтому проверка должна быть верной.
В следующем уроке, «Моделирование данных», вы узнаете самый распространённый способ описывать данные объединениями в TypeScript: размеченные объединения (discriminated unions), где свойство вроде kind говорит, чем является каждый объект. Вы также познакомитесь с JavaScript-конструкцией switch и узнаете, как TypeScript следит, чтобы вы не забыли ни один случай.
Задание
- 1
Давайте потренируемся. В редакторе — доска квестов в таверне. У каждого квеста есть регион, награда (золото или предмет) и иногда герой, который помогает его выполнить. Запустите программу: TypeScript находит ошибку в данных. Исправьте её.
- 2
Напишите функцию
formatRewardс параметромrewardтипаnumber | stringи возвращаемым типомstring. Для числа она возвращает, например,золото: 10; для строки — строку спредмет:перед ней, напримерпредмет: Серебряный меч. - 3
Напишите функцию
describeQuestс параметромtitle(строка). Она находит на доске квест с таким названием и возвращает описание вродеКрысы в шахте (шахты) — золото: 10, помощник: никого: используйтеformatReward, а для квеста без помощника —??. Если квеста с таким названием нет, функция возвращает, например,Квест не найден: Охота на дракона. Выведите описания квестов"Мост тролля","Крысы в шахте"и"Охота на дракона". Тогда программа выведет:Мост тролля (горы) — предмет: Серебряный меч, помощник: Бруно Крысы в шахте (шахты) — золото: 10, помощник: никого Квест не найден: Охота на дракона