TypeScript
| Автор | Андерс Хейлсберг (Microsoft) |
|---|---|
| Первый выпуск | октябрь 2012 |
| Парадигма | мультипарадигменный, надмножество JavaScript |
| Типизация | статическая, структурная, постепенная |
| Компилятор | tsc (написан на TypeScript; порт на Go — TypeScript 7) |
| Расширения файлов | .ts, .tsx, .d.ts |
| Лицензия | Apache 2.0 |
| Сайт | typescriptlang.org |
TypeScript — язык программирования от Microsoft, являющийся надмножеством JavaScript: любой корректный JavaScript-код — это корректный TypeScript, к которому добавлена система статических типов. Компилятор tsc проверяет типы и стирает их, выдавая обычный JavaScript, который выполняется в браузере или Node.js. Язык позволяет находить ошибки до запуска, даёт редактору точное автодополнение и безопасный рефакторинг.[1]
История
TypeScript представил Андерс Хейлсберг (автор Turbo Pascal, Delphi и C#) в 2012 году — как ответ на трудности сопровождения больших JavaScript-кодовых баз. Ранние версии конкурировали с Dart от Google и CoffeeScript, но выиграли за счёт совместимости: можно переводить проект на TypeScript постепенно, файл за файлом. Переломным стал 2016 год, когда Angular 2 был написан на TypeScript, а пакеты @types из репозитория DefinitelyTyped дали типы для тысяч библиотек на чистом JavaScript.[4] Сегодня TypeScript — язык по умолчанию для React, Vue, Angular, серверных фреймворков и инструментов сборки.
В 2025 году Microsoft объявила о переписывании компилятора на Go (проект Corsa, версия TypeScript 7): нативный компилятор проверяет крупные проекты примерно в десять раз быстрее.[3]
Система типов
Типизация в TypeScript структурная: совместимость типов определяется формой объекта, а не именем класса — в отличие от номинальной типизации Java или C#. Она постепенная: тип any отключает проверку, что позволяет мигрировать по частям (сходный подход — аннотации типов в Python).
interface User {
id: number;
name: string;
email?: string; // необязательное поле
}
type Result<T> = { ok: true; value: T } | { ok: false; error: string };
function find(users: User[], id: number): Result<User> {
const u = users.find(x => x.id === id);
return u ? { ok: true, value: u } : { ok: false, error: "not found" };
}
const r = find([], 1);
if (r.ok) console.log(r.value.name); // сужение типа: здесь r.value доступен
Важные возможности:
- Объединения и сужение (
string | number, проверкиtypeof, размеченные объединения, какResultвыше). - Дженерики — параметризованные функции и типы.
- Вывод типов — аннотации нужны в основном на границах функций.
- Вычисляемые типы:
keyof, условные типы, mapped types, шаблонные строковые типы, утилитыPartial<T>,Pick<T, K>,ReturnType<F>. - Файлы объявлений
.d.ts— описание типов для кода на JavaScript.
Система типов намеренно не является строго корректной (sound): ради удобства допускаются некоторые небезопасные преобразования, а типы во время выполнения не существуют — данные извне (JSON из API) нужно проверять отдельно, например библиотекой Zod.
Настройка и инструменты
Проект описывается файлом tsconfig.json. Ключевые параметры: strict (включает набор строгих проверок, рекомендуется всегда), target (версия выходного JavaScript), module и moduleResolution, noEmit (только проверка, без генерации кода).[2]
npm install --save-dev typescript
npx tsc --init # создать tsconfig.json
npx tsc --noEmit # проверить типы
Во многих проектах tsc используется только для проверки, а «стирание» типов выполняют быстрые инструменты — esbuild, swc, Vite. Начиная с версии 23.6 Node.js умеет запускать .ts-файлы напрямую, просто удаляя аннотации (type stripping), а Deno и Bun поддерживают TypeScript изначально.[5] Комитет TC39 обсуждает предложение добавить синтаксис аннотаций типов в сам JavaScript, чтобы движки игнорировали их как комментарии.[6]
Критика
- Шаг сборки и сложность конфигурации (модули ESM/CommonJS, пути).
- Сложные типы на уровне шаблонов трудно читать и они замедляют проверку.
- Ложное чувство безопасности: типы не проверяются во время выполнения.