Итоги
В этом уроке вы узнали, что:
- Вспомогательные типы (utility types) — это обобщённые типы, встроенные в TypeScript, которые делают новый тип из существующего. Их проверяет только TypeScript, и, как любые типы, они исчезают из программы.
- Spread (JavaScript) копирует свойства объекта в новый объект:
{ ...hero, level: 4 }. Побеждает то, что записано позже, поэтому в{ ...hero, ...changes }изменения заменяют старые значения. В массивах[...items, "Верёвка"]создаёт новый массив с ещё одним элементом. Partial<Hero>— этоHero, у которого каждое свойство необязательное. Он подходит для изменений:function updateHero(hero: Hero, changes: Partial<Hero>): Hero.Omit<Hero, "id">— этоHeroбезid, а уPick<Hero, "name" | "level">есть толькоnameиlevel.Pickпроверяет имена,Omit— нет.readonly string[], его же можно записать какReadonlyArray<string>, — это массив, который можно читать, но нельзя менять: безpush, безpop, безitems[0] = …. Функция, которая только читает массив, должна принимать массив только для чтения; обычный массив тоже подойдёт.Readonly<Hero>делает каждое свойство доступным только для чтения.Hero["heroClass"]— это тип свойства другого типа, так что тип записан только один раз. Для объединенияQuest["status"]— объединение всех статусов, а уRecord<Quest["status"], number>есть число для каждого из них.- В типе
typeof startingStats— это тип переменной:type Stats = typeof startingStats;. Аtypeofиз JavaScript в коде даёт текст, пока выполняется программа. A & B— это пересечение: оба типа сразу, со всеми свойствами обоих:type Boss = Monster & { phase: number };.A | B— одно или другое.
В следующем уроке, «Итоговый проект», вы соберёте вместе весь курс и шаг за шагом создадите инвентарь и журнал квестов Киры.
А теперь практика. В редакторе лежит книга заклинаний Киры. Изучение нового заклинания не должно менять старую книгу: функция возвращает новую.
Задание
- 1
Напишите функцию
learnSpell(book: readonly Spell[], spell: Omit<Spell, "id">): Spell[], которая возвращает новый массив: все заклинания изbookи в конце новое заклинание сid: book.length + 1. Используйте spread дважды: для массива и для заклинания. - 2
Напишите функцию
spellsOf(book: readonly Spell[], school: Spell["school"]): string[], которая возвращает в массиве названия заклинаний одной школы. Подойдёт циклfor...ofсpushилиfilterиmap. - 3
Под функциями запишите
learnSpell(spellbook, { name: "Ледяное копьё", school: "ice", mana: 4 })в константуnewBook. Затем выведитеspellsOf(newBook, "ice")иspellsOf(spellbook, "ice"). Старая книга заклинаний не изменилась:["Ледяная вспышка", "Ледяное копьё"] ["Ледяная вспышка"]