Недостающие и лишние свойства
Когда у переменной есть тип, TypeScript проверяет каждый объект, который вы в неё кладёте, свойство за свойством. Постоянно встречаются две ошибки: свойства не хватает или, наоборот, есть лишнее. Сначала недостающее:
type Item = { name: string; price: number };
const rope: Item = { name: "Верёвка" };main.ts(3,7): error TS2741: Property 'price' is missing in type '{ name: string; }' but required in type 'Item'.Читайте так: у объекта, который вы написали, тип { name: string; }, а Item требует ещё и price. В JavaScript верёвка попала бы в магазин без цены, и сумма покупки получилась бы NaN. Если не хватает нескольких свойств, сообщение перечисляет их все, например Type '{ name: string; }' is missing the following properties from type 'Item': price, weight (TS2739).
Теперь лишнее свойство:
type Item = { name: string; price: number };
const rope: Item = { name: "Верёвка", price: 5, weight: 2 };main.ts(3,49): error TS2353: Object literal may only specify known properties, and 'weight' does not exist in type 'Item'.Литерал объекта (object literal) — это объект, записанный прямо в коде, в фигурных скобках. Лишнее свойство в нём обычно означает одно из двух. Либо в типе не хватает нужного вам свойства, и его надо добавить в тип, либо свойство в объекте не нужно, и его надо удалить.
Очень часто это опечатка. Тогда TypeScript угадывает, что вы имели в виду:
type Item = { name: string; price: number };
const rope: Item = { name: "Верёвка", prise: 5 };main.ts(3,39): error TS2561: Object literal may only specify known properties, but 'prise' does not exist in type 'Item'. Did you mean to write 'price'?Лишние свойства проверяются только в литералах объектов. Объект, который уже лежит в другой переменной, может иметь больше свойств, чем нужно типу. TypeScript требует лишь, чтобы в нём были все свойства типа:
type Item = { name: string; price: number };
const loot = { name: "Верёвка", price: 5, weight: 2 };
const rope: Item = loot;
console.log(rope);Программа выведет:
{ name: "Верёвка", price: 5, weight: 2 }Так TypeScript думает об объектах вообще: объект является Item, если у него есть всё, что нужно для Item.
Задание
- 1
Исправьте двух монстров, о которых сообщает TypeScript. У тролля опечатка, а у гоблина не хватает урона: он равен 3. Программа выведет:
волк: здоровье 30, урон 6 тролль: здоровье 80, урон 12 гоблин: здоровье 20, урон 3 - 2
В лес приходит паук. Под гоблином добавьте
const spider: Monster = { name: "паук", health: 15, damage: 4, reward: 8 };, а в конце выведитеdescribe(spider). TypeScript сообщает оreward— такого свойства у монстров нет. На этот раз чего-то не хватает именно типу: добавьтеreward: numberвMonster. Тогда TypeScript сообщит об остальных трёх монстрах, ведь у них нет награды. Дайте им её: 10 волку, 40 троллю и 5 гоблину. Теперь программа выведет ещё ипаук: здоровье 15, урон 4. - 3
В конце программы выведите награду за всех четырёх монстров вместе, сложив их свойства
reward:Награда: 63