В JavaScript ошибку в типах видно только при запуске — а иногда не видно вовсе:
function total(price, count) {
return price * count
}
total('100', 3) // 300 — повезло, строка сама стала числом
total(100) // NaN — count забыли, никто не заметилTypeScript — это JavaScript, в котором у значений есть типы, а компилятор проверяет их до запуска. Тот же код:
function total(price: number, count: number): number {
return price * count
}
total('100', 3) // ошибка: Argument of type 'string' is not assignable to parameter of type 'number'
total(100) // ошибка: Expected 2 arguments, but got 1Код ещё не запущен, а ошибки уже найдены. В редакторе их подчеркнёт красным, здесь — покажет кнопка «Запустить».
Аннотации: тип через двоеточие
Тип пишут после имени через двоеточие. Это называется аннотацией:
let city: string = 'Казань'
let age: number = 30
let isAdmin: boolean = falseТри главных примитивных типа — string, number и boolean. Пишутся с
маленькой буквы: String с большой — это другое, его в аннотациях не берут.
У функции аннотируют параметры и, после скобок, результат:
function greet(name: string): string {
return 'Привет, ' + name
}Вывод типов: писать всё не нужно
TypeScript умеет выводить тип сам — из значения:
let city = 'Казань' // тип string, компилятор понял сам
city = 42 // ошибка: Type 'number' is not assignable to type 'string'Поэтому у переменных со значением тип обычно не пишут. А вот параметры
функции вывести не из чего — их аннотируют всегда. В строгом режиме, в
котором работает этот курс, параметр без типа — уже ошибка:
Parameter 'name' implicitly has an 'any' type.
Как читать ошибку
Ошибки TypeScript пишет по-английски, но устроены они одинаково: что не так и с чем не сошлось.
строка 3: Type 'string' is not assignable to type 'number'.Читается так: «на строке 3 значение типа string нельзя положить туда, где
ждут number». Слова, которые встретятся чаще всего:
- is not assignable to — не подходит под тип;
- Argument of type — тип аргумента при вызове;
- Expected 2 arguments, but got 1 — аргументов не столько, сколько надо;
- implicitly has an 'any' type — тип не указан, и вывести его не из чего.
Типы исчезают при запуске
Браузер и Node.js TypeScript не понимают. Перед запуском компилятор стирает типы и получается обычный JavaScript:
function greet(name: string): string { ... } // TypeScript
function greet(name) { ... } // что запуститсяОтсюда важное следствие: типы проверяются только при компиляции. Во время
работы программы их уже нет — проверить «а это точно number?» можно лишь
обычным typeof, как в JavaScript.
Как здесь устроены задания
Как и в курсе по JavaScript, сначала проверка — потом тесты. Только теперь проверок две:
- Типы. Если компилятор нашёл ошибку, тесты даже не запускаются, а вы видите номер строки и текст ошибки.
- Тесты. Как раньше: код запускается и сверяется с ожиданиями.
Часть тестов проверяет сами типы. Например, что функция возвращает именно
number, а не «что угодно». Если такая проверка не сошлась, вы увидите
строку теста с пояснением: в тестах — assertType<…>() // total возвращает number.
И одно правило курса: any не засчитывается. Это тип «что угодно» — он
выключает проверку, и с ним любая ошибка проходит молча. Задача курса —
научиться описывать типы, а не прятаться от них.