Когда писать тип
Теперь вы можете написать тип для любой переменной. Нужно ли? Для TypeScript let gold: number = 120; и let gold = 120; означают одно и то же: в обоих случаях gold — это number, а gold = "много"; — ошибка. Аннотация лишь повторяет то, что уже говорит значение 120. Поэтому программисты обычно опускают её, когда переменная сразу получает значение, и позволяют TypeScript вывести тип. Код получается короче и читается легче, а когда вы меняете значение, не нужно менять заодно и тип.
Пишите тип сами там, где значение не говорит TypeScript, что вы имеете в виду. Чаще всего это переменная, у которой ещё нет значения. Без типа и без значения TypeScript позволяет положить в неё что угодно, как и JavaScript:
let reward;
reward = 50;
reward = "пятьдесят";
console.log(reward);Эта программа запускается без ошибки и выводит пятьдесят. TypeScript лишь следит за тем, что вы туда кладёте. А с типом он проверяет каждое сохраняемое значение:
let reward: number;
reward = 50;
reward = "пятьдесят";main.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.Без типа такая ошибка проявляется лишь позже, там, где программа использует переменную, а сообщение труднее понять. Допустим, reward получает число в одной ветке if и строку в другой. Тогда gold + reward сообщает Operator '+' cannot be applied to types 'number' and 'string | number'. TypeScript знает, что reward может быть строкой или числом (именно это значит string | number; подробнее вы узнаете в уроке «Объединения и сужение типов»), но не говорит, в какой строке программы туда попала строка. С let reward: number; ошибка указывает на строку с ошибкой.
Другие места, где нужен тип, и вы скоро с ними встретитесь:
- Пустой массив: по одному лишь
[]TypeScript не может понять, что в него будут класть. В упражнении про массивы вы напишетеconst loot: string[] = [];. - Параметры функций: TypeScript не умеет их выводить, поэтому их типы вы будете писать в уроке «Функции».
- Переменная, которая должна хранить больше, чем подсказывает её первое значение, например число или строку (урок «Объединения и сужение типов»).
В этом курсе мы пишем тип там, где он нужен или где он делает код понятнее, а в остальных местах позволяем TypeScript вывести его.
Задание
- 1
Запустите программу. TypeScript сообщает об ошибке в строке, где награда прибавляется к золоту, но настоящая ошибка в другом месте. Дайте
rewardтипnumberи запустите программу снова. Теперь ошибка указывает на строку, которая кладёт вrewardстроку. Слабый монстр даёт 20 золота: исправьте строку так, чтобы в неё сохранялось число 20. - 2
Уберите аннотации у
heroName,goldиmonsterLevel: TypeScript выведет те же типы по их значениям. Программа по-прежнему выводитКира, золото: 140. - 3
Кира побеждает более сильного монстра: измените значение
monsterLevelна6, чтобы программа вывела:Кира, золото: 220