Поздравляем!
Поздравляем, ваша программа работает, и вы дошли до конца курса TypeScript! Она описывает Киру, перечисляет её предметы, использует их, ищет тот, которого у неё нет, просматривает её квесты и составляет отчёт. А прежде чем она запустилась, TypeScript проверил каждую её строку.
Последнее улучшение. Кира находит волшебный свиток — новый вид предмета: { kind: "scroll"; name: string; spell: string }. В обычном JavaScript вы добавили бы свиток и понадеялись бы, что не забыли ни одного места, где работают с предметами. TypeScript находит их за вас. Как только тип Scroll оказывается в объединении Item, а свиток — в инвентаре Киры, он сообщает об обеих функциях с switch:
main.ts(45,19): error TS2322: Type 'Scroll' is not assignable to type 'never'.
main.ts(51,43): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.Первая ошибка — это проверка с never в describeItem, которая называет тип, для которого нет case. Вторая — в useItem: проверки с never в ней нет, но тип возврата string требует, чтобы она возвращала текст для любого предмета. Добавьте case в обе функции, и программа снова заработает. В большой программе это одна из главных сильных сторон TypeScript: измените данные, и он покажет все места, которым нужно об этом знать.
Что вы узнали. Посмотрите, как каждый урок курса нашёл своё место в вашей программе:
- Введение в TypeScript: TypeScript проверяет программу до запуска, и его сообщения говорят, что не так и в какой строке. Затем типы удаляются, и запускается оставшийся JavaScript.
- Основные типы: большинству переменных аннотации не нужны; TypeScript выводит, что
nameв цикле — строка. Типы вы пишете там, где они важны. - Функции имеют типы параметров и результатов:
describeHero(hero: Hero): string. Тип возврата ещё и нашёл пропущенный case вuseItem. - Типы объектов:
interface Heroописывает Киру, со свойствомnameтолько для чтения и необязательнымweapon. - Объединения и сужение типов:
HeroClassдопускает только три класса,findможет вернутьundefined, а проверкаitem === undefinedразбирается с драконьим яйцом. - Моделирование данных: предметы и квесты — размеченные объединения.
switchих сужает, проверка полноты сneverохраняетdescribeItem, аRecordхранит счётчики. - Обобщения:
findByName<T extends { name: string }>находит всё, у чего есть имя, а результат сохраняет свой тип. - Классы в этой программе не понадобились: хватило простых объектов и функций. Класс удобен, когда данные и методы, которые их меняют, составляют одно целое, например если бы у каждого монстра был свой
attack(). - Вспомогательные типы:
Quest["status"]берёт статусы изQuest, поэтому они записаны только в одном месте.
TypeScript на вашем компьютере. Здесь программы проверял и запускал ваш браузер. На собственном компьютере вам понадобятся три вещи:
- Редактор. Visual Studio Code бесплатен и понимает TypeScript без всякой настройки. Он подчёркивает ошибки типов красным по мере набора, а если навести мышь на имя, показывает его тип. Вы видите свои ошибки ещё до того, как сохраните файл.
- Node.js, который запускает JavaScript вне браузера. Скачайте версию LTS с nodejs.org и установите её. Вместе с ним появятся команды
node,npmиnpx, которые вводятся в терминале (в Windows — в командной строке, на Mac — в приложении «Терминал»). - TypeScript. Создайте папку для проекта, например
adventure, перейдите в неё в терминале командойcdи установите в неё TypeScript:
Первая команда создаёт файлnpm init -y npm install --save-dev typescriptpackage.json, который описывает проект. Вторая скачивает TypeScript (версии 7, той же, что проверяла ваши программы здесь) в папкуnode_modules.
Сохраните программу в папке как main.ts. Проверяется она компилятором TypeScript, tsc:
npx tsc --noEmit main.tsКогда всё в порядке, он ничего не выводит. Иначе он выводит знакомые вам по этому курсу сообщения, цветные и со строкой кода под каждым. Только место записано чуть иначе: main.ts:2:1 - error TS2322: … означает строку 2, столбец 1. --noEmit значит «только проверить»: без него tsc создал бы ещё и main.js, вашу программу на JavaScript без типов. А программа запускается в Node.js:
node main.tsNode.js 24 и новее может запускать файл .ts напрямую: он удаляет типы и запускает оставшийся JavaScript. Но проверять типы он не умеет! Программа с ошибкой типов всё равно запустится, как запустился бы JavaScript. Поэтому сначала проверьте её с помощью tsc, а потом запускайте через node. Кроме того, Node.js умеет лишь удалять типы. Возможности TypeScript, которые пришлось бы превращать в новый код JavaScript, например enum, останавливают его сообщением TypeScript enum is not supported in strip-only mode. Поэтому в этом курсе их не использовали, и этот сайт их тоже не допускал.
Большой проект хранит настройки в файле tsconfig.json. Команда npx tsc --init создаёт его с рекомендуемыми настройками, и дальше весь проект проверяется командой npx tsc --noEmit без имени файла. (Если указать имя файла, tsc проигнорирует настройки и сообщит вам об этом ошибкой.) Эти настройки даже чуть строже здешних. Например, при noUncheckedIndexedAccess у kira.inventory[0] тип Item | undefined, ведь массив может оказаться пустым.
Что дальше. Вы знаете самые важные части TypeScript, и их достаточно для собственных программ. Вот несколько идей, что изучать дальше:
- Продолжайте улучшать свою программу. Магазин, где Кира покупает предметы за золото, монстр, с которым она сражается мечом в руке, повышение уровня, когда она выполнит достаточно квестов. Больше всего вы узнаёте, решая собственные задачи, а TypeScript подскажет, что ломает каждое изменение.
- Справочник по TypeScript (TypeScript Handbook) на typescriptlang.org/docs объясняет всё из этого курса подробнее, и многое другое (на английском). На том же сайте Playground позволяет пробовать TypeScript в браузере и показывает, во что он превращается в JavaScript.
- Веб-страницы на TypeScript. У страницы и её элементов из урока «JavaScript на веб-страницах» в TypeScript тоже есть типы:
document.querySelector("#list")возвращает элемент илиnull, и TypeScript заставит вас это проверить, как и с драконьим яйцом. - React — библиотека для создания веб-приложений из компонентов. Многие проекты на React написаны на TypeScript. Курс React учит самому React на обычном JavaScript.
А если захотите попробовать другой язык, вас ждут курсы Python, C и C++.
Задание
- 1
Под
Keyнапишите типScrollсkind: "scroll",nameиspell(строка) и добавьте его в объединениеItem. В конец инвентаря Киры добавьте{ kind: "scroll", name: "Свиток света", spell: "Свет" }. Запустите программу и исправьте обе ошибки, о которых сообщит TypeScript: вdescribeItemсвиток даётСвиток света (заклинание: Свет), а вuseItem—Кира читает заклинание: Свет. После этого программа выведет всё с начала урока:Кира, следопыт, уровень 3, здоровье 34/50, золото 120 Инвентарь: - Целебное зелье (лечит на 20) - Серебряный меч (урон 12) - Старый ключ (открывает склеп) - Свиток света (заклинание: Свет) Кира пьёт «Целебное зелье»: здоровье 50/50 Кира берёт в руку «Серебряный меч» Кира не нашла предмет «Драконье яйцо» Квесты: [выполнено] Волки в лесу: золото +50 [активно] Потерянная корона [провалено] Спасти мельника: мельница сгорела [выполнено] Мост гоблинов: золото +30 Выполнено: 2, активно: 1, провалено: 1 Кира, следопыт, уровень 3, здоровье 50/50, золото 200