Псевдонимы типов
Писать { name: string; health: number } у каждой переменной, параметра и массива, где лежит герой, долго, а когда у героев появится новое свойство, менять придётся везде. Вместо этого дайте типу имя с помощью type — вы использовали его в уроке «Функции» для типов функций:
type Hero = { name: string; health: number };
function describeHero(hero: Hero): string {
return `${hero.name} (здоровье ${hero.health})`;
}
const kira: Hero = { name: "Кира", health: 50 };
const party: Hero[] = [kira, { name: "Бруно", health: 65 }];
for (const hero of party) {
console.log(describeHero(hero));
}Программа выведет:
Кира (здоровье 50)
Бруно (здоровье 65)type Hero = ...; создаёт псевдоним типа (type alias): Hero теперь — другое имя для { name: string; health: number }. Его можно использовать везде, где нужен тип: для переменных (kira: Hero), параметров (hero: Hero), возвращаемых типов и массивов (Hero[] — массив героев). Когда тип меняется, вы меняете его в одном месте.
Имена типов начинаются с заглавной буквы (Hero, MagicItem), чтобы их можно было отличить от переменных, которые начинаются со строчной. Типы обычно пишут в начале программы.
Теперь сообщения об ошибках используют это имя, поэтому становятся короче:
type Hero = { name: string; health: number };
const kira: Hero = { name: "Кира", health: 50 };
console.log(kira.gold);main.ts(4,18): error TS2339: Property 'gold' does not exist on type 'Hero'.Псевдоним типа существует только для TypeScript. Как и любой тип, он исчезает из JavaScript, который выполняется. Поэтому type Hero не создаёт никакого героя: он лишь описывает, как выглядит герой.
Типичные ошибки:
- Пропущенный
=:type Item { name: string; price: number };даёт'=' expected. - Имя, написанное иначе. Имена типов зависят от регистра, как и переменные:
const sword: item = ...даётCannot find name 'item'. Did you mean 'Item'? - Два псевдонима с одним именем:
Duplicate identifier 'Item'.Каждое имя типа можно использовать только один раз.
Задание
- 1
В начале программы создайте псевдоним типа
Itemдля{ name: string; price: number }. Затем используйтеItemво всех трёх местах вместо длинного типа. - 2
Под щитом создайте массив
shopWindowтипаItem[]с тремя предметами:sword,shieldи новым — фонарём{ name: "Фонарь", price: 15 }. - 3
Замените две строки
console.logв конце цикломfor...ofпоshopWindow, который выводит ценник каждого предмета. Программа выведет:Серебряный меч: цена 120 Дубовый щит: цена 45 Фонарь: цена 15