# TypeScript

> Язык Microsoft, добавляющий к JavaScript статическую типизацию; компилируется в обычный JavaScript и стал стандартом для крупных фронтенд- и Node.js-проектов.

Источник: https://llmdocs.ru/wiki/typescript/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Автор**: Андерс Хейлсберг (Microsoft)
- **Первый выпуск**: октябрь 2012
- **Парадигма**: мультипарадигменный, надмножество JavaScript
- **Типизация**: статическая, структурная, постепенная
- **Компилятор**: tsc (написан на TypeScript; порт на Go — TypeScript 7)
- **Расширения файлов**: .ts, .tsx, .d.ts
- **Лицензия**: Apache 2.0
- **Сайт**: typescriptlang.org
**TypeScript** — язык программирования от Microsoft, являющийся надмножеством [JavaScript](https://llmdocs.ru/wiki/javascript.md): любой корректный JavaScript-код — это корректный TypeScript, к которому добавлена система статических типов. Компилятор `tsc` проверяет типы и стирает их, выдавая обычный JavaScript, который выполняется в браузере или [Node.js](https://llmdocs.ru/wiki/nodejs.md). Язык позволяет находить ошибки до запуска, даёт редактору точное автодополнение и безопасный рефакторинг.[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](https://llmdocs.ru/wiki/type-hints.md)).

```ts
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](https://llmdocs.ru/wiki/json.md) из API) нужно проверять отдельно, например библиотекой Zod.

## Настройка и инструменты

Проект описывается файлом `tsconfig.json`. Ключевые параметры: `strict` (включает набор строгих проверок, рекомендуется всегда), `target` (версия выходного JavaScript), `module` и `moduleResolution`, `noEmit` (только проверка, без генерации кода).[2]

```bash
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, пути).
- Сложные типы на уровне шаблонов трудно читать и они замедляют проверку.
- Ложное чувство безопасности: типы не проверяются во время выполнения.

## См. также

- [JavaScript](https://llmdocs.ru/wiki/javascript.md)
- [Node.js](https://llmdocs.ru/wiki/nodejs.md)
- [npm](https://llmdocs.ru/wiki/npm.md)
- [Типизация в Python (type hints, PEP 484)](https://llmdocs.ru/wiki/type-hints.md)
- [mypy и pyright](https://llmdocs.ru/wiki/mypy-pyright.md)

## Источники

1. [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html)
2. [TypeScript — tsconfig reference](https://www.typescriptlang.org/tsconfig/)
3. [Microsoft — A 10x Faster TypeScript (порт компилятора на Go)](https://devblogs.microsoft.com/typescript/typescript-native-port/)
4. [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)
5. [Node.js — Running TypeScript Natively](https://nodejs.org/en/learn/typescript/run-natively)
6. [TC39 — Type Annotations proposal](https://github.com/tc39/proposal-type-annotations)
