Typescript не копирует файлы d.ts для сборки
Так что, возможно, я сбит с толку, но я подумал, что если я declaration:trueдобавлю в свой tsconfig.json, я могу заставить его tsc скопировать мои *.d.tsфайлы вместе с перенесенным кодом и его d.tsфайлами?
НАПРИМЕР:
- src
- lib
- types.d.ts
- foo.ts
Я ожидал, что результат tsc будет примерно таким:
- build
- lib
- types.d.ts
- foo.js
- foo.d.ts
Однако я не могу types.d.tsскопировать в каталог сборки.
Машинопись не предоставляет никакого механизма для копирования .d.tsфайлов? Или у меня просто где-то неверная конфигурация? (Я пробовал много разных конфигураций на данный момент; похоже, ничего не работает)
Ответы
Вы правы - declaration:trueподразумевается, что только для каждого заданного .tsфайла tscсоздается и копируется соответствующий .d.tsвыходной файл в buildкаталог (в дополнение .jsи, .mapесли применимо). Таким образом tsc, ваш пользовательский types.d.tsфайл не будет копироваться в выходной каталог.
В основном .d.tsфайлы рассматриваются компилятором как неприкасаемый ввод для проверки типов. Они не используются для генерации выходных данных, что также означает, что они не копируются build. Вы можете прочитать большеhttps://github.com/Microsoft/TypeScript/issues/5112 о точке зрения сопровождающих:
Используемые вами файлы .d.ts являются входом в систему сборки, но не выходом. Вполне разумно использовать некоторые типы из .d.ts, но при этом в вашем выводе эти типы не используются, поэтому не будет причин распространять входной .d.ts с результатами сборки. [...] Похоже, вам понадобится этап после сборки в вашем инструменте сборки, чтобы скопировать соответствующие файлы .d.ts туда, где они вам нужны.
Файлы .d.ts считаются «ссылками», компилятор не будет их трогать, перемещать или воссоздавать. Проще всего думать о файлах .d.ts: они идут вместе с вашими файлами .js. если вы копируете файлы .js, вам следует скопировать соответствующие файлы .d.ts.
Решение № 1. Скопируйте файлы d.ts с помощью шага сборки вручную
Возможное решение - скопировать все необходимые .d.tsфайлы, например, types.d.tsвручную на этапе сборки. Конкретный инструмент зависит от вашего проекта и типа сборки, в том числе от ОС. Этот инструмент должен сохранять структуру каталогов srcпри копировании файлов build, чтобы importссылки на типы по-прежнему работали. Назвать несколько:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(оболочка), rsync, robocopyили независимый от платформы NPM пакет какhttps://www.npmjs.com/package/copyfiles:
"scripts": {
"copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}
Решение # 2: переименуйте файлы d.ts в расширение .ts
Измените свои .d.tsфайлы на .tsрасширение (или повторно интегрируйте типы в существующие .tsфайлы), поэтому tscпозаботьтесь о выпуске объявлений в выводе. Незначительный недостаток: у вас нет принудительного разделения компилятором между типами и кодом реализации ( d.tsфайлы не могут содержать код). Большое преимущество в том, что вам не нужен дополнительный этап сборки.
На мой взгляд, последний - самый простой подход к созданию общедоступного API, например, для вашего пакета npm, тогда как .d.tsфайл может стать кандидатом для объявления внутреннего и общего типа.
Надеюсь, это поможет.