Ошибки компиляции
Когда таможенник находит нарушение, он составляет протокол. В нём сказано, какая это посылка, где нашлось нарушение, какое правило нарушено и в чём суть. tsc сообщает об ошибке так же подробно, и сейчас мы научимся читать его протокол.
Ошибку, которую tsc находит при проверке, называют ошибкой компиляции: она видна до запуска, по тексту программы. Вот файл hello.ts, где цене присвоили текст:
let price: number = 100;
price = "free"; // ✗Переменная price объявлена с типом number, а во второй строке в неё кладут строку "free". Команда tsc hello.ts печатает в терминале:
hello.ts:2:1 - error TS2322: Type 'string' is not assignable to type 'number'.
2 price = "free";
~~~~~
Found 1 error in hello.ts:2Первая строка по частям
Главное в сообщении — его первая строка. Разберём её слева направо:
hello.ts— файл с ошибкой.2— номер строки.1— номер столбца, то есть символа в строке, с которого начинается проблемное место. Здесь это первый символ, имяprice.error— пометка, что это ошибка.TS2322— код ошибки.Type 'string' is not assignable to type 'number'.— текст: «типstringнельзя присвоить типуnumber».
В таком тексте сначала идёт тип значения, которое кладут, а потом тип места, куда его кладут. Здесь строку пытаются положить в переменную для чисел.
Подчёркивание и итог
Под первой строкой tsc повторяет строку кода с её номером и подчёркивает проблемное место волной ~~~~~. Последняя строка подводит итог: сколько ошибок нашлось и в каком файле.
Короткая запись
Если вывод tsc попадает не на экран, а в файл или в другую программу, то же сообщение выглядит короче:
hello.ts(2,1): error TS2322: Type 'string' is not assignable to type 'number'.Части те же, только строка и столбец стоят в скобках, а подчёркивания нет. В уроках курса от сообщения остаются код и текст: error TS2322: Type 'string' is not assignable to type 'number'.
Код ошибки
tsc пишет сообщения по-английски. Флаг — добавка к команде, которая меняет её работу: tsc --locale ru hello.ts печатает сообщения по-русски. Код ошибки при этом на любом языке один и тот же. По коду TS2322 в поиске находятся объяснения и примеры, поэтому курс приводит сообщения в оригинале, а что они значат, объясняет словами.
Программа не запускалась
Обратите внимание: tsc нашёл ошибку, не выполнив ни одной строки. Он читает текст, поэтому видит ошибки даже в коде, который никогда не выполнится. Эту функцию никто не вызывает, а ошибка в ней всё равно есть:
function neverCalled(): number {
return "ten"; // ✗
}error TS2322: Type 'string' is not assignable to type 'number'.Функция обещала вернуть число, а возвращает строку. JavaScript о такой ошибке не узнал бы никогда: до этой строки выполнение не доходит.
Частая ошибка
Чинить то, о чём говорит сообщение, хотя причина в другой строке:
function double(n: number): number {
return n * 2;
}
const input: string = "21";
console.log(double(input)); // ✗error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.Сообщение указывает на строку 6: «аргумент типа string нельзя передать параметру типа number». Оно говорит о параметре типа number. Если «починить» этот параметр и написать n: string, ошибка переедет во вторую строку: строку нельзя умножить на 2. Настоящая причина — в строке 5: в input лежит текст, а нужно число. Исправление — const input: number = 21;.
Место в сообщении показывает, где tsc заметил несовпадение. Саму ошибку могли допустить и выше.
Главное
- Ошибку компиляции
tscнаходит по тексту программы, ничего не запуская, — даже в коде, который не выполняется. - Первая строка сообщения — файл, строка, столбец, код и текст:
hello.ts:2:1 - error TS2322: …. - Код вида
TS2322одинаков на любом языке, по нему ищут объяснение. - Сообщение показывает, где
tscзаметил несовпадение, а причина может быть строкой выше.