Примитивные типы
Чему вы научитесь:
- записывать примитивные типы
number,string,boolean,bigintиsymbol; - объяснять, почему в строгом режиме
nullне подходит к типуstring; - отличать
anyотunknownи проверять значениеunknownперед использованием; - объяснять, что значат
voidиneverв типе результата функции.

Вернёмся на таможню из первой темы. Каждая посылка едет с декларацией, где написано, что лежит внутри. Инспектор сверяет декларацию с содержимым и только потом пропускает посылку через границу. В TypeScript декларация — это тип, а инспектор — компилятор tsc.
Самые простые посылки везут одно значение: число, кусок текста, ответ «да» или «нет». Типы таких значений называются примитивными. Сами значения вам знакомы по JavaScript, а TypeScript добавляет к ним декларацию:
const price: number = 199.9;
const title: string = "Kettle";
const inStock: boolean = true;
console.log(title, price, inStock); // Kettle 199.9 trueРазберём пример по строкам:
priceобъявлена с типомnumber: в ней число.titleхранит строку, её тип —string.inStockхранит логическое значение, её тип —boolean.console.logпечатает все три значения. Типы на вывод не влияют: после проверкиtscих стирает.
Если положить в коробку не то, что написано в декларации, например строку "yes" в inStock, инспектор остановит посылку ещё до запуска программы.
Пять примитивных типов
В аннотациях пишут те же слова, которые возвращает оператор typeof в JavaScript:
number— любые числа: целые, дробные, а ещёNaNиInfinity;string— строки;boolean— два значения,trueиfalse;bigint— целые числа любой длины, их пишут с буквойnна конце:10n;symbol— уникальные значения, которые создаёт функцияSymbol.
Два последних типа встречаются в программах редко, но записываются так же:
const big: bigint = 9007199254740993n;
const id: symbol = Symbol("id");
console.log(typeof big, typeof id); // bigint symboltypeof печатает те же слова, что стоят в аннотациях: bigint и symbol. Смешивать bigint и number в одном выражении нельзя. Выражение big + 1 компилятор не пропустит, а JavaScript на такой строке бросил бы TypeError.
number хранит целые числа точно только до 9007199254740991, а число из примера больше: как number оно округлилось бы до 9007199254740992. Для таких чисел и нужен bigint.
Один number для всех чисел
Во многих языках целые и дробные числа — разные типы: int, float, double. В TypeScript, как и в JavaScript, для всех обычных чисел один тип — number. Переменная let count: number = 3 спокойно примет и 2.5.
Типа int в TypeScript нет вовсе. Аннотация let count: int = 3 даёт ошибку Cannot find name 'int': компилятор не знает такого имени.
На собеседовании часто спрашивают, какие базовые типы есть в TypeScript. В ответе стоит назвать пять примитивов, сказать, что number один на все числа, и добавить про null и undefined. О них — следующий раздел.
null и undefined — отдельные типы
В JavaScript пустое значение можно положить в любую переменную. Беда приходит позже: если в city лежит null, строка city.toUpperCase() останавливает программу с TypeError: Cannot read properties of null (reading 'toUpperCase').
В строгом режиме, который в курсе включён всегда, у null и undefined свои типы — тоже примитивные, так что всего примитивных типов семь. В типе null одно значение — null, в типе undefined тоже одно — undefined. К другим типам они не подходят:
const city: string = null; // ✗error TS2322: Type 'null' is not assignable to type 'string'.Декларация «текст» на пустой коробке — неправда, и инспектор такую посылку не пропускает. Так же let count: number = undefined даёт Type 'undefined' is not assignable to type 'number'. Зато переменной типа string можно доверять: в ней всегда строка, и её методы не упадут на null.
Учтите: typeof null по старой ошибке JavaScript даёт "object", а тип в TypeScript называется null.
Здесь аналогия с таможней перестаёт работать. Настоящий инспектор открывает коробку, а tsc видит только код: он проверяет то, что записано в программе, и не видит значений, которые придут при запуске.
Частая ошибка
Тип написали с большой буквы:
function shout(text: string): string {
return text.toUpperCase();
}
const greeting: String = "Hi";
console.log(shout(greeting)); // ✗error TS2345: Argument of type 'String' is not assignable to parameter of type 'string'.
'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.String, Number и Boolean с большой буквы — типы объектов-обёрток: так называют объекты, которые JavaScript создаёт вызовом вроде new String("Hi"). TypeScript разрешает писать такие типы, но там, где ждут string, они не подходят. Вторая строка сообщения подсказывает исправление: напишите string строчными буквами, и вызов shout(greeting) пройдёт проверку.
Главное
- Примитивные типы пишут строчными буквами:
number,string,boolean,bigint,symbol— теми же словами, что печатаетtypeof. number— один тип для целых и дробных чисел; типовintиfloatв TypeScript нет.- В строгом режиме
nullиundefined— отдельные типы, иstringих не принимает. String,NumberиBooleanс большой буквы — типы объектов-обёрток, в аннотациях их не пишут.