Объекты в функциях
Типы объектов особенно полезны в функциях — как типы параметров и возвращаемые типы. Тогда первая строка функции рассказывает всё: что она принимает и что возвращает.
Функция, которая создаёт объекты одной формы, — её часто называют фабрикой (factory) — получает этот тип в качестве возвращаемого. Тогда TypeScript проверяет объект, который она возвращает:
interface Monster {
name: string;
level: number;
health: number;
}
function createMonster(name: string, level: number): Monster {
return { name: name, health: level * 10 };
}main.ts(8,5): error TS2741: Property 'level' is missing in type '{ name: string; health: number; }' but required in type 'Monster'.Без возвращаемого типа функция вернула бы монстра без level, а ошибка проявилась бы только позже, там, где читают уровень монстра. С ним TypeScript сообщает о самом return.
Вот рабочая версия вместе с функцией, которая изменяет монстра:
interface Monster {
name: string;
level: number;
health: number;
}
function createMonster(name: string, level: number): Monster {
return { name: name, level: level, health: level * 10 };
}
function enrage(monster: Monster): void {
monster.level = monster.level + 2;
}
const wolf = createMonster("волк", 3);
enrage(wolf);
console.log(wolf);Программа выведет:
{ name: "волк", level: 5, health: 30 }wolf получает тип Monster из возвращаемого типа функции, без аннотации. enrage изменяет именно тот объект, который вы ей передаёте, а не его копию, поэтому изменение видно и за пределами функции — так же, как levelUp изменила уровень Киры в упражнении про свойства только для чтения. Её возвращаемый тип — void: она ничего не возвращает, её результат — это изменение.
Вызовы проверяются, как и с любым другим типом параметра:
interface Monster {
name: string;
level: number;
health: number;
}
function enrage(monster: Monster): void {
monster.level = monster.level + 2;
}
enrage("волк");
enrage({ name: "тролль", level: 4, health: 40, angry: true });main.ts(11,8): error TS2345: Argument of type 'string' is not assignable to parameter of type 'Monster'.
main.ts(12,48): error TS2353: Object literal may only specify known properties, and 'angry' does not exist in type 'Monster'.Первый вызов передаёт текст вместо монстра. Второй передаёт литерал объекта с лишним свойством, как в упражнении про лишние свойства.
Типичные ошибки:
- Свойства не хватает в возвращаемом объекте:
Property 'level' is missing in type ..., сообщение указывает наreturn. - Передача чего-то другого вместо объекта, например имени монстра:
Argument of type 'string' is not assignable to parameter of type 'Monster'.
Задание
- 1
Напишите функцию
createMonsterс параметрамиname(string) иlevel(number) и возвращаемым типомMonster. Она возвращает нового монстра с этим именем и уровнем, у которогоhealthравноlevel * 10. - 2
С помощью
createMonsterсоздайтеwolf— волка уровня 2 — иtroll— тролля уровня 5. Выведите обоих черезdescribe. Программа выведет:волк: уровень 2, здоровье 20 тролль: уровень 5, здоровье 50 - 3
Напишите функцию
trainс параметромmonsterтипаMonsterи возвращаемым типомvoid. Она повышает уровень монстра на 1, а его здоровье — на 10. - 4
Потренируйте волка два раза, а затем снова выведите его через
describe. В конце программа выведет:волк: уровень 4, здоровье 40