Итоги
В этом уроке вы узнали, что:
- TypeScript определяет тип объекта по его свойствам:
{ name: string; health: number; }. Добавить свойство, которого нет в типе, нельзя (Property 'gold' does not exist on type ...), поэтому давайте объекту все его свойства сразу при создании. - Тип объекта можно записать как аннотацию,
let target: { name: string; health: number };, или дать ему имя с помощью псевдонима типа:type Hero = { name: string; health: number };. Тогда используйтеHeroдля переменных, параметров, возвращаемых типов и массивов (Hero[]). - В литерале объекта недостающее свойство даёт TS2741 (
Property 'price' is missing in type ...), лишнее — TS2353, а опечатка — TS2561 с подсказкойDid you mean to write 'price'?. - У необязательного свойства есть вопросительный знак:
nickname?: string. Его может не быть, его тип —string | undefined, и перед использованием его нужно проверить. - Свойство
readonlyнельзя изменить после создания объекта:Cannot assign to 'name' because it is a read-only property.В отличие отconst, оно защищает одно свойство, а не переменную. - Интерфейс тоже описывает объект:
interface Monster { name: string; health: number }.interface Boss extends Monster { phase: number }добавляет свойства, иBossможно использовать везде, где нуженMonster. - Свойство может содержать другой объект:
position: Position. Внутренние типы с собственными именами делают типы и сообщения об ошибках короче. - С
Item[]проверяется каждый элемент массива, а вfor...ofкаждыйitem— этоItem. - В функциях типы объектов — это типы параметров (
function train(monster: Monster): void) и возвращаемые типы (function createMonster(name: string): Monster). Функция, которая меняет свойство, меняет тот самый объект, который вы ей передали, а не его копию.
В следующем уроке, «Объединения и сужение типов», вы познакомитесь с типами, которые допускают значения нескольких видов, например string | number, или с целью, которая может быть null, и увидите, как TypeScript следит за вашими условиями, чтобы понимать, какое значение у вас есть.
Задание
- 1
Давайте потренируемся. Создайте интерфейс
Questсо свойствомidтипаnumber, доступным только для чтения, свойствамиtitle(string) иreward(number) и необязательным свойствомnote(string). - 2
Создайте массив
questsтипаQuest[]с тремя квестами: id 1, «Волки в лесу», награда 50; id 2, «Потерянная корона», награда 120, с заметкой"спросить мельника"; id 3, «Мост гоблинов», награда 30. Напишите функциюdescribeQuest, которая принимаетQuestи возвращает его строку; если у квеста есть заметка, она добавляется в конце, в скобках. Цикломfor...ofвыведите каждый квест:№1 Волки в лесу: награда 50 №2 Потерянная корона: награда 120 (спросить мельника) №3 Мост гоблинов: награда 30 - 3
Напишите функцию
totalReward, которая принимаетQuest[]и возвращает сумму наград. Выведите:Общая награда: 200