TS базовые типы
Базовые типы TypeScript — примитивы (string, number, boolean, null, undefined, symbol, bigint) и составные конструкции (массив, кортеж, объект, enum), которые описывают форму данных и включают статическую проверку во время компиляции.
Зачем нужно
- Явная аннотация типов устраняет целый класс ошибок ещё до запуска кода
- TypeScript выводит типы автоматически (type inference), поэтому аннотировать нужно только там, где компилятор не справляется
- Понимание базовых типов — фундамент для union, generic, utility types и остальных продвинутых конструкций
Где используется
- Любая переменная, параметр функции, возвращаемое значение — всё имеет тип
- Описание формы данных API, стора, конфигурации
- Пропсы React-компонентов, параметры хуков
Основной контент
Примитивы
const name: string = "Alice";
const age: number = 30;
const active: boolean = true;
const nothing: null = null;
const missing: undefined = undefined;
const id: symbol = Symbol("userId");
const big: bigint = 9007199254740993n;
// Type inference — TypeScript сам вычисляет тип
const inferred = "hello"; // string, аннотация не нужна
Массивы и кортежи
// Массив — однородная коллекция
const numbers: number = [1, 2, 3];
const words: Array<string> = ["a", "b", "c"];
// Кортеж (tuple) — фиксированная длина и типы позиций
type Point = [number, number];
const origin: Point = [0, 0];
type NamedPoint = [x: number, y: number, label: string];
const p: NamedPoint = [10, 20, "A"];
// Деструктуризация кортежа
const [x, y, label] = p;
Объектные типы: interface и type alias
// interface — для описания форм объектов, расширяемый
interface User {
id: number;
name: string;
email: string;
role?: "admin" | "user"; // опциональное поле
}
// type alias — для union, intersection, примитивов, кортежей
type UserId = number;
type Status = "active" | "inactive";
// Объектный тип через type alias
type Point = { x: number; y: number };
// Разница: interface можно расширить повторным объявлением (declaration merging)
interface User {
createdAt: Date; // добавляется к предыдущему interface User
}
Enum
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
function move(dir: Direction): void {
console.log(`Moving ${dir}`);
}
move(Direction.Up); // "Moving UP"
move("UP"); // Ошибка! Не string, а Direction
// const enum — стирается при компиляции, встраивается как литерал
const enum Status {
Active, // 0
Inactive, // 1
}
Union и Intersection
// Union — одно из нескольких
type StringOrNumber = string | number;
function print(val: StringOrNumber): void {
console.log(val);
}
// Discriminated union — union с общим полем-тегом
type Result<T> =
| { success: true; data: T }
| { success: false; error: string };
// Intersection — сочетание нескольких типов
type Admin = User & { permissions: string };
Аннотации функций
// Параметры и возвращаемый тип
function add(a: number, b: number): number {
return a + b;
}
// Стрелочная функция
const multiply = (a: number, b: number): number => a * b;
// Опциональный параметр и параметр по умолчанию
function greet(name: string, greeting: string = "Hello"): string {
return `${greeting}, ${name}!`;
}
// Rest-параметры
function sum(...nums: number): number {
return nums.reduce((acc, n) => acc + n, 0);
}
Literal types
type Direction = "north" | "south" | "east" | "west";
type DiceValue = 1 | 2 | 3 | 4 | 5 | 6;
function roll: DiceValue {
return (Math.floor(Math.random * 6) + 1) as DiceValue;
}
Частые ошибки
- Аннотировать всё подряд — TypeScript хорошо выводит типы, избыточные аннотации только шумят
- Путать
nullиundefined— вstrictNullChecksрежиме это разные типы и их нужно обрабатывать явно - Использовать
Number,String,Boolean(с заглавной) вместоnumber,string,boolean— это объектные обёртки, не примитивы - Enum вместо union literal — строковые enum часто избыточны,
type Dir = "up" | "down"читается лучше - Не указывать тип возвращаемого значения функции — при сложной логике компилятор может вывести неожиданный тип