Базовые типы: string, number, boolean

Три кита системы типов и магия автоматического вывода.

Аннотация типа — запись вида let x: number, которая фиксирует, какие значения допустимы для переменной.

Примитивы

Базовые типы повторяют примитивы JavaScript. Аннотация ставится через двоеточие после имени:

let userName: string = "Аня";
let age: number = 30;
let isAdmin: boolean = false;

Если попытаться присвоить значение не того типа, компилятор остановит:

age = "тридцать";
// Ошибка: Type 'string' is not assignable to type 'number'.

Тип number в TypeScript один — он покрывает и целые, и дробные числа, как и в JavaScript. Отдельного int или float нет.

Вывод типов (type inference)

Чаще всего аннотацию писать не нужно. Если переменная сразу инициализируется значением, TypeScript сам выводит её тип:

let city = "Москва";  // тип выведен как string
let count = 42;        // выведен как number

city = "Казань";       // ок
count = "много";       // Ошибка: Type 'string' is not assignable to type 'number'.

Здесь мы не писали типы, но TypeScript всё равно их знает и защищает переменные. Это важная философия языка: писать минимум аннотаций, доверяя выводу. Явные типы ставят там, где вывод невозможен или где аннотация улучшает читаемость.

Когда аннотация нужна

Аннотация обязательна, если значение присваивается не сразу:

let result: number;   // объявили без значения
result = compute();   // тип уже известен — проверка работает

Без аннотации здесь TypeScript вывел бы тип any — «что угодно», и проверка отключилась бы. Поэтому при отложенной инициализации тип указывают явно.

Поведение в рантайме совпадает с JS

Помните: после компиляции типы исчезают, и арифметика работает как в обычном JavaScript. Пример с реальным выводом:

const price = 250;
const quantity = 3;
const total = price * quantity;

console.log("Сумма заказа: " + total + " руб.");
console.log("Тип переменной total:", typeof total);

Вывод:

Сумма заказа: 750 руб.
Тип переменной total: number

Литеральный тип у const

Тонкость: для const TypeScript выводит не широкий тип, а литеральный — конкретное значение:

const role = "admin"; // тип не string, а ровно "admin"
let mode = "dark";    // а тут тип string (let можно переприсвоить)

Это логично: const нельзя переприсвоить, значит значение точно останется "admin". Литеральные типы пригодятся дальше для union-типов.

Итог

  • Базовые типы: string, number (целые и дробные вместе), boolean.
  • При инициализации тип выводится автоматически — лишние аннотации не нужны.
  • Явная аннотация обязательна при отложенном присваивании, иначе тип станет any.
Проверьте себя
1. Какой тип будет выведен для переменной let count = 42?
Aany
Bnumber
Cstring
Dтип не выводится, нужна аннотация
2. Сколько числовых типов есть в TypeScript для целых и дробных чисел?
AДва: int и float
BОдин: number — он покрывает и целые, и дробные
CТри: int, float и double
DЗависит от настройки strict
3. Почему важно аннотировать переменную при отложенном присваивании (let result; ... result = ...)?
AИначе код не скомпилируется
BБез аннотации тип выведется как any и проверка отключится
CЭто требование линтера, а не компилятора
DЧтобы переменная стала константой
Поддержать проект