- Главная
- Typescript
- Настройка tsconfig.json и файлы объявлений
Настройка tsconfig.json и файлы объявлений
За компиляцией TypeScript стоит не только превращение .ts в .js. Файл tsconfig.json решает ещё и то, какие вспомогательные файлы появятся рядом с обычным JavaScript. В этом уроке разберёмся, зачем нужны файлы объявлений, карты деклараций и source map и как включить их через настройки компилятора.
Компилятор делает больше, чем просто убирает типы
Когда tsc компилирует проект, он не просто стирает аннотации типов и оставляет чистый JavaScript. В зависимости от настроек в tsconfig.json, компилятор может параллельно создавать ещё три вида файлов: файлы объявлений, карты объявлений и карты исходников. Каждый из них решает свою задачу и адресован разным потребителям — либо другим разработчикам, либо инструментам отладки.
Разница станет понятнее, если представить, что итоговый JavaScript уходит в браузер или на сервер, а вот файлы объявлений остаются рядом с исходным кодом как «инструкция» для TypeScript-компилятора, который позже будет использовать вашу библиотеку.
Файлы, которые умеет создавать tsc
Файлы объявлений .d.ts
Файл объявления, или declaration file, содержит только сигнатуры типов — без реализации функций и без логики. Это как бы «скелет» модуля: какие функции экспортируются, какие у них параметры и что они возвращают.
// math.ts
export function sum(a: number, b: number): number {
return a + b;
}
После компиляции с включённой опцией declaration рядом с math.js появится файл math.d.ts:
export declare function sum(a: number, b: number): number;
Такие файлы нужны, если вы публикуете библиотеку. Пользователь вашего пакета получает обычный JavaScript, а IDE — файл .d.ts, благодаря которому автодополнение и проверка типов продолжают работать, даже если сама библиотека написана на чистом JavaScript.
Карты объявлений .d.ts.map
Declaration map — это карта соответствия между файлом объявления и оригинальным .ts-файлом. Без неё редактор кода при переходе «к определению» (go to definition) приводит вас в сгенерированный .d.ts-файл, где нет реализации — только типы. С включённой картой редактор способен перейти сразу в исходный .ts-файл, туда, где функция действительно написана.
Включайте declarationMap вместе с declaration при разработке собственных библиотек в монорепозитории. Тогда переход «к определению» из другого пакета в редакторе сразу открывает настоящий исходник на TypeScript, а не сухую сигнатуру из .d.ts — это экономит массу времени при отладке общих типов.
Source map .js.map
Source map связывает скомпилированный .js-файл с исходным .ts. Она нужна не для типов, а для отладки в браузере или Node.js: когда в консоли возникает ошибка или вы ставите точку останова, среда показывает строку в оригинальном TypeScript-файле, а не в сгенерированном JavaScript, который реальный человек обычно не читает.
Как включить генерацию файлов через tsconfig.json
Все три типа файлов управляются флагами компилятора в секции compilerOptions:
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"outDir": "./dist",
"rootDir": "./src",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true
}
}
Коротко о смысле каждого флага:
| Флаг | Что делает |
|---|---|
declaration |
Создаёт файлы .d.ts рядом с каждым скомпилированным модулем |
declarationMap |
Добавляет карту, связывающую .d.ts с исходным .ts |
sourceMap |
Создаёт .js.map для отладки скомпилированного JavaScript |
outDir |
Задаёт папку, куда попадут все сгенерированные файлы |
Обратите внимание: declarationMap без declaration не сработает — карта объявлений существует только вместе с самим файлом объявления, компилятор выдаст ошибку, если включить только её.
Практический пример
Допустим, есть небольшой проект с такой структурой:
src/
index.ts
tsconfig.json
После запуска tsc с конфигом из примера выше в папке dist появятся сразу четыре файла:
index.js— рабочий JavaScript-кодindex.d.ts— файл объявления с типамиindex.d.ts.map— карта для перехода из.d.tsв исходникindex.js.map— карта для отладки JavaScript
Если открыть index.d.ts.map или index.js.map в текстовом редакторе, внутри будет не читаемый человеком код, а сжатый JSON с координатами строк и колонок — эти файлы предназначены для инструментов, а не для чтения глазами.
Когда файлы объявлений не нужны
Если вы пишете обычное приложение — сайт, серверный сервис, скрипт — которое не превращается в переиспользуемый пакет для других разработчиков, генерировать .d.ts обычно незачем. Типы нужны только во время разработки и проверки, а до конечного пользователя приложения долетает лишь JavaScript. В таких проектах declaration и declarationMap оставляют выключенными, а вот sourceMap часто включают — он полезен всегда, когда планируется отлаживать код в браузере или через Node.js инспектор.
Не добавляйте сгенерированные .d.ts, .d.ts.map и .js.map файлы в систему контроля версий, если это не библиотека, предназначенная для публикации. Пропишите папку outDir в .gitignore — эти файлы полностью выводятся из исходников, и хранить их в репозитории — источник лишних конфликтов при слиянии веток.
Итоги
tsconfig.json определяет не только то, как TypeScript превращается в JavaScript, но и какие вспомогательные файлы появляются рядом с результатом компиляции.
Файлы объявлений .d.ts нужны, чтобы делиться типами вместе с библиотекой, карты объявлений .d.ts.map возвращают редактору способность прыгать сразу в исходный код, а source map .js.map делает отладку скомпилированного JavaScript комфортной. Понимание того, когда включать каждый из этих флагов, помогает не захламлять проект лишними файлами и одновременно не терять удобство разработки там, где оно действительно нужно.
В следующем уроке мы вернёмся к синтаксису самого TypeScript — разберём интерфейсы, их расширение и композицию для описания сложных объектов.