Перейти к содержимому
Теория · Первые шаги · урок 4 из 7

Ошибки компиляции

Когда таможенник находит нарушение, он составляет протокол. В нём сказано, какая это посылка, где нашлось нарушение, какое правило нарушено и в чём суть. tsc сообщает об ошибке так же подробно, и сейчас мы научимся читать его протокол.

Ошибку, которую tsc находит при проверке, называют ошибкой компиляции: она видна до запуска, по тексту программы. Вот файл hello.ts, где цене присвоили текст:

TypeScript
let price: number = 100;
price = "free"; // ✗

Переменная price объявлена с типом number, а во второй строке в неё кладут строку "free". Команда tsc hello.ts печатает в терминале:

TEXT
hello.ts:2:1 - error TS2322: Type 'string' is not assignable to type 'number'.

2 price = "free";
  ~~~~~


Found 1 error in hello.ts:2

Первая строка по частям

Главное в сообщении — его первая строка. Разберём её слева направо:

  1. hello.ts — файл с ошибкой.
  2. 2 — номер строки.
  3. 1 — номер столбца, то есть символа в строке, с которого начинается проблемное место. Здесь это первый символ, имя price.
  4. error — пометка, что это ошибка.
  5. TS2322 — код ошибки.
  6. Type 'string' is not assignable to type 'number'. — текст: «тип string нельзя присвоить типу number».

В таком тексте сначала идёт тип значения, которое кладут, а потом тип места, куда его кладут. Здесь строку пытаются положить в переменную для чисел.

Подчёркивание и итог

Под первой строкой tsc повторяет строку кода с её номером и подчёркивает проблемное место волной ~~~~~. Последняя строка подводит итог: сколько ошибок нашлось и в каком файле.

Короткая запись

Если вывод tsc попадает не на экран, а в файл или в другую программу, то же сообщение выглядит короче:

TEXT
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 нашёл ошибку, не выполнив ни одной строки. Он читает текст, поэтому видит ошибки даже в коде, который никогда не выполнится. Эту функцию никто не вызывает, а ошибка в ней всё равно есть:

TypeScript
function neverCalled(): number {
    return "ten"; // ✗
}
TEXT
error TS2322: Type 'string' is not assignable to type 'number'.

Функция обещала вернуть число, а возвращает строку. JavaScript о такой ошибке не узнал бы никогда: до этой строки выполнение не доходит.

Частая ошибка

Чинить то, о чём говорит сообщение, хотя причина в другой строке:

TypeScript
function double(n: number): number {
    return n * 2;
}

const input: string = "21";
console.log(double(input)); // ✗
TEXT
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 заметил несовпадение, а причина может быть строкой выше.