Перейти к основному содержимому

Экосистема и архитектура TypeScript

Разработчику Архитектору

Дальше: Форматы и подключение · TypeScript Server · JS-курс: monorepo и публикация · Справочник — tsconfig


TypeScript в продакшене — не только tsc: пакетный менеджер, типы из @types/*, сборщик (Vite, esbuild), линтер, тесты и CI. Здесь — карта экосистемы, структура репозитория, монорепозиторий с project references и проверка типов в пайплайне.

Маршрут: О разделеэкосистемаФорматы и подключениеКомпиляция.

Обзор без учебных деталей — Обзор TypeScript в JS. Таблицы tsconfig301.


Слои экосистемы

Исходники .ts / .tsx

├── tsserver (IDE, tsserver)
├── tsc / tsc -b (проверка, emit, declarations)
├── bundler (Vite, esbuild, Webpack) — часто без emit tsc
├── ESLint (@typescript-eslint)
└── CI: typecheck + test + build

JavaScript → Node / браузер
КомпонентРоль
typescriptкомпилятор, tsc, tsserver
@types/*типы для JS-библиотек (DefinitelyTyped)
Bundlerсборка для браузера, tree-shaking
ESLint + Prettierстиль и часть логических правил
Vitest / Jestтесты с TS из коробки

Типичная структура одного пакета

my-app/
├── package.json
├── tsconfig.json
├── src/
│ ├── index.ts
│ └── types/
│ └── api.ts
├── dist/ # после tsc (в .gitignore)
└── tests/

package.json (фрагмент):

{
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
"lint": "eslint src",
"test": "vitest run"
},
"devDependencies": {
"typescript": "~5.7.0",
"@types/node": "^22.0.0"
}
}

Разбор:

  • Типы API выносят в src/types — контракт между слоями — 6.md.
  • typecheck в CI даже если bundle делает Vite — 15.md.

DefinitelyTyped и @types

Библиотеки на чистом JS не несут .d.ts — типы ставят отдельно:

npm i lodash
npm i -D @types/lodash

Разбор:

  • Пакеты @types/* публикуются из DefinitelyTyped.
  • Современные пакеты иногда включают типы в npm ("types" в package.json) — @types не нужен.

Рекомендуемый стартовый стек

ИнструментНазначение
TypeScript + strictпроверка типов
ESLint @typescript-eslintправила TS, unused vars
Prettierформатирование
Vitest или Jestunit-тесты
tsc --noEmit в CIgate на PR

Минимальный tsconfig9.md; политика strict — 6.md.


Frontend vs backend

НаправлениеСборкаТипичный module
SPA (React/Vue)ViteESNext + bundler resolution
Node APItsc или tsxNodeNext
Библиотека npmtsc + declarationNodeNext / ESM

Прикладные статьи: 21.md (React), 22.md (Node).


Монорепозиторий

Несколько пакетов в одном git-репозитории — monorepo (pnpm workspaces, npm workspaces, Nx, Turborepo).

repo/
├── package.json # workspaces
├── tsconfig.base.json
├── packages/
│ ├── core/
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── src/
│ └── app/
│ ├── package.json
│ ├── tsconfig.json
│ └── src/

Корневой tsconfig.base.json:

{
"compilerOptions": {
"composite": true,
"declaration": true,
"declarationMap": true,
"strict": true,
"module": "NodeNext",
"moduleResolution": "NodeNext"
}
}

packages/core/tsconfig.json:

{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}

packages/app/tsconfig.json с зависимостью:

{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"references": [{ "path": "../core" }],
"include": ["src"]
}

Сборка всего дерева:

tsc -b

Разбор:

  • composite: true — пакет можно подключать через references.
  • tsc -b (build mode) собирает граф в правильном порядке и инкрементально.
  • tsserver использует тот же граф — быстрее в IDE на больших репо — 16.md.

Указатель в JS-курсе — JS-курс: monorepo и публикация. Таблицы — Справочник — tsconfig.


Публикация библиотеки на npm

ШагДействие
1"declaration": true — генерировать .d.ts
2"types": "dist/index.d.ts", "exports" в package.json
3"files": ["dist"] — только артефакты
4npm publish после tsc -b

Потребители получают типы вместе с JS — контракт API стабилен.


CI: проверка типов

Пример шага GitHub Actions:

- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
cache: "npm"
- run: npm ci
- run: npm run typecheck

Для monorepo:

- run: npx tsc -b

Разбор:

  • typecheck должен падать PR при ошибке типов — тот же контракт, что в IDE.
  • Не полагайтесь только на build bundler'а: он может пропустить отдельные файлы.

Кэширование: node_modules + incremental .tsbuildinfo при composite.


Разделение ответственности: tsc vs bundler

ЗадачаКто
Проверка типов всего проектаtsc --noEmit или tsc -b
Быстрый dev-serverVite
Транспиляция в старый targettsc или esbuild в bundler
.d.ts для библиотекиtsc с declaration

Частый паттерн SPA: Vite собирает, tsc -b или tsc --noEmit проверяет типы (в шаблоне react-ts это шаг build перед vite build) — 15.md. Для Vue-проектов аналог — vue-tsc --noEmit.


Связь с разделом энциклопедии

СлойГде
Учёба5-10-typescript/*.md
Обзор в JS-курсе30
Таблицы301
Индекс2.md — не второй справочник

Частые ошибки

ОшибкаПричинаЧто делать
Нет typecheck в CIполагались на Vitetsc --noEmit
Версии TS расходятсяглобальный tsserverworkspace TS — 16.md
Monorepo тормозитодин tsconfig на всёreferences + composite
Типы не находятсянет @typesустановить или обновить пакет
dist в gitартефакты в репо.gitignore, files в publish
Дублирование 301 в статьяхшумссылка на справочник

Практика

  1. Добавьте в учебный проект скрипт typecheck и шаг в CI (или локальный npm run typecheck перед push).
  2. Вынесите типы API в src/types и импортируйте в сервисе.
  3. Нарисуйте схему: IDE → tsserver → тот же tsconfig, что и CI.
  4. (Опционально) Создайте два пакета core + app с references и соберите tsc -b.
  5. Установите @types для одной JS-библиотеки и проверьте автодополнение.

Смежные статьи