Что такое TypeScript
TypeScript — это строго типизированный надмножество JavaScript, которое компилируется в чистый JavaScript.
Зачем нужно
- Раннее обнаружение ошибок — ошибки типов ловятся на этапе компиляции, а не в рантайме
- Автодополнение и рефакторинг — IDE понимает структуру кода и предлагает точные подсказки
- Самодокументирующийся код — типы описывают контракты функций и объектов
- Масштабируемость — чем больше проект, тем больше отдача от типизации
- Снижение количества багов — исследования показывают снижение на ~15% только за счёт типов
Где используется
- Крупные frontend-фреймворки: Angular (написан на TS), React (поддерживает TS), Vue 3 (написан на TS)
- Backend: Node.js с TypeScript (NestJS, Express + TS)
- Мобильная разработка: React Native, Ionic
- Desktop: Electron (VS Code написан на TS)
- Инфраструктура: Deno, Bun нативно поддерживают TS
Предпосылки
- Базовое знание JavaScript (переменные, функции, объекты, массивы)
- Понимание ES6+ синтаксиса (arrow functions, destructuring, modules)
- Опыт работы с npm
TypeScript — надмножество JavaScript
Любой валидный JavaScript-код является валидным TypeScript-кодом. TypeScript добавляет поверх JS систему статических типов:
// Это валидный JS и валидный TS
const greeting = "Hello";
console.log(greeting);
// А это — только TS (аннотация типа)
const greeting: string = "Hello";
console.log(greeting);
Что добавляет TypeScript поверх JavaScript
// 1. Аннотации типов
let name: string = "Alice";
let age: number = 30;
let isActive: boolean = true;
// 2. Интерфейсы
interface User {
id: number;
name: string;
email: string;
}
// 3. Типизированные функции
function getUser(id: number): User {
return { id, name: "Alice", email: "alice@example.com" };
}
// 4. Generics (обобщённые типы)
function identity<T>(value: T): T {
return value;
}
// 5. Enum
enum Status {
Active,
Inactive,
Banned,
}
// 6. Вывод типов (type inference)
const count = 42; // TypeScript сам определит: number
const items = [1, 2, 3]; // number
Сравнение TypeScript и JavaScript
| Критерий | JavaScript | TypeScript |
|---|---|---|
| Типизация | Динамическая | Статическая (опциональная) |
| Компиляция | Интерпретируется | Компилируется в JS |
| Ошибки | В рантайме | На этапе компиляции |
| Инструменты | Базовые | Мощное автодополнение |
| Кривая обучения | Ниже | Выше |
| Подходит для | Мелкие проекты, прототипы | Средние и крупные проекты |
| Совместимость | Нативно в браузерах/Node | Нужен этап компиляции |
Как работает TypeScript
tsc (компилятор)
TypeScript (.ts) ─────────────────→ JavaScript (.js) → Браузер / Node.js
↑
tsconfig.json
(настройки компиляции)
- Пишем код на TypeScript (
.ts,.tsx) - Компилятор
tscпроверяет типы - Если ошибок нет — генерируется JavaScript
- JavaScript запускается в браузере или Node.js
Важно: Все типы стираются при компиляции. В рантайме типов TypeScript не существует.
// TypeScript (до компиляции)
function add(a: number, b: number): number {
return a + b;
}
// JavaScript (после компиляции)
function add(a, b) {
return a + b;
}
Когда стоит использовать TypeScript
Используйте TypeScript когда:
- Проект больше ~1000 строк кода
- Команда больше 1 человека
- Есть сложные структуры данных
- Нужна надёжность (финтех, медицина)
- Проект долгоживущий (будет поддерживаться годами)
JavaScript достаточно когда:
- Быстрый прототип или proof-of-concept
- Маленький скрипт на 50 строк
- Одноразовый скрипт автоматизации
Вывод типов (Type Inference)
TypeScript не требует указывать типы везде — он умеет выводить их автоматически:
// Явная аннотация — не нужна, TS сам поймёт
let message: string = "Hello";
// Вывод типов — TS определит тип как string
let message = "Hello";
// TS выводит тип возвращаемого значения как number
function add(a: number, b: number) {
return a + b; // return type: number
}
// TS выводит тип из контекста
const numbers = [1, 2, 3];
// map callback: (value: number, index: number) => number
const doubled = numbers.map((n) => n * 2);
Частые ошибки
- Думать что TS проверяет типы в рантайме — нет, все типы стираются при компиляции
- Использовать
anyповсюду — это отключает проверку типов и лишает смысла TS - Пытаться типизировать всё сразу — начинайте с
strict: falseи включайте опции постепенно - Забывать про
nullиundefined— включитеstrictNullChecks - Путать TS с другими типизированными языками — TS использует структурную типизацию, не номинативную
// Структурная типизация: совместимость по структуре, а не по имени
interface Point {
x: number;
y: number;
}
interface Coordinate {
x: number;
y: number;
}
const p: Point = { x: 1, y: 2 };
const c: Coordinate = p; // OK! Структура совпадает
Практика
- Установите TypeScript:
npm install -g typescript - Создайте файл
hello.ts:function greet(name: string): string { return `Hello, ${name}!`; } console.log(greet("World")); // console.log(greet(42)); // Раскомментируйте — увидите ошибку - Скомпилируйте:
tsc hello.ts - Запустите:
node hello.js - Попробуйте вызвать
greet(42)— посмотрите на ошибку компилятора
Связанные темы
- Установка и tsconfig — настройка проекта
- Компиляция — процесс компиляции
- Примитивные типы — базовые типы данных
- Миграция JS → TS — как перевести существующий JS-проект