Какие операции разрешены
TypeScript знает, что делает каждый оператор с каждым типом, и сообщает об операциях, которые не имеют смысла. В этой программе их четыре:
let gold = 120;
const priceTag = "15";
console.log(priceTag * 2);
console.log(gold - priceTag);
if (gold === "120") {
console.log("Кира богата!");
}
if (gold > "100") {
console.log("Кира богата!");
}main.ts(4,13): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
main.ts(5,20): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
main.ts(6,5): error TS2367: This comparison appears to be unintentional because the types 'number' and 'string' have no overlap.
main.ts(9,5): error TS2365: Operator '>' cannot be applied to types 'number' and 'string'.- Арифметике нужны числа. Операторы
-,*,/и%— арифметические операции, и обе их стороны, левая и правая, должны быть числами. (anyотключает проверку, о нём речь в конце этого урока;bigint— тип для огромных целых чисел, а enum — более старая возможность TypeScript, которую этот курс не использует.) В JavaScript"15" * 2равно30, потому что JavaScript сам превращает строку в число. TypeScript считает это ошибкой: вы, скорее всего, не знали, что значение — строка, а с+то же значение не сложилось бы, а склеилось. - Число и строка никогда не равны.
===сравнивает и типы, поэтому в JavaScriptgold === "120"всегдаfalse. TypeScript сообщает, что сравнение выглядит непреднамеренным, потому что ни одно значение не может быть одновременно числом и строкой (у типов «нет пересечения», no overlap). Сравнение через<или>— тоже ошибка. - Склеивать через
+можно. Когда одна сторона+— строка,+склеивает, как вы знаете:"Золото: " + gold.
Если число хранится как строка, преобразуйте его. Number() из курса JavaScript превращает строку в число, а String() — число в строку:
console.log(Number("15") * 2);
console.log(String(15) + 2);Вывод:
30
152TypeScript знает, что Number(…) — это всегда number, поэтому Number(priceTag) * 2 допустимо. Но он не знает, действительно ли в строке записано число: Number("fifteen") даёт NaN, как и в JavaScript.
Задание
- 1
Кира покупает 40 стрел в лавке Бруно, но TypeScript сообщает о двух ошибках. Исправьте обе: превратите цену с ценника в число с помощью
Number()и сравните золото с числом50. Тогда программа выведет:У Киры заканчивается золото! Осталось золота: 40 - 2
Бруно выписывает Кире чек. В конце программы выведите его, склеив строки с
countиtotalчерез+:Чек: стрел 40, сумма 80