Как заставить tsc использовать типы проверяемых пакетов вместо типов места его вызова?
Доброго дня.
Столкнулся с запутанной ситуацией. Есть несколько репозиториев: один главный, и несколько общих библиотек, которые ставятся как node модули, а локально линкуются посредством yarn link. Тайпчекинг осуществляется посредством утилиты tsc.
Для обрисовки картины, пусть будет репозиторий Vault, который использует библиотеку Utils. В Utils установлен dayjs, неплохая либа для работы с датой. Она добавляет свои объявления типов, все ок. Я использую встроенный в dayjs тип Dayjs в некоторых случаях, для операций с данным объектом.
Проблема следующая: когда запускаем yarn tsc внутри Utils, чтобы проверить корректность типов самой Utils, все работает, tsc видит типы от библиотеки dayjs. А когда я запускаю tsc внутри Vault, он валится с сообщением "cannot find type Dayjs", и ссылается на строку, где я использую один из модулей пакета Utils. В самом Vault библиотека dayjs и тип Dayjs нигде не используются!
Иными словами, tsc залезает в другой репозиторий и проверяет типы там, но с использованием деклараций из проекта, в котором он был вызван.
Решение в лоб - установить в Vault либу dayjs. Прибегну в крайнем случае, ибо в Vault используется враппер из Utils для работы с датой.
Надеюсь, понятно объяснил суть проблемы. Кто сталкивался? Как решить проблему?
Заранее спасибо.
В самом Vault библиотека dayjs и тип Dayjs нигде не используются!
А что вы понимаете под использованием? Очевидно, для исполнения вам нужен dayjs, и он должен ставиться как рантайм-зависимость Utils. Чтобы избавиться от такой зависимости, вам тогда нужно положить dayjs внутрь Utils тем или иным способом, например собрать Utils тем же роллапом в бандл. Я правда не вижу в этом необходимости - бандлятся обычно только конечные приложения, а то что есть транзитивные зависимости у библиотеки -
Другое дело если вы видите проблему в том что требуется информация о ТИПА Dayjs. Тогда уточните, как во что вы компилируете Utils и не протекат ли Dayjs через публичный интерфейс Utils.
Тогда уточните, как во что вы компилируете Utils и не протекат ли Dayjs через публичный интерфейс Utils.
Там просто rollup. Декларационные файлы и собственно модули просто копируются в dist и все. Это, фактически, даже не сборка, просто когда импортируем через "import from @vendor/module" берется из dist.
Типы для dayjs лежат в node_modules/dayjs/index.d.ts, но они, как я понял, не подтягиваются автоматически. Как подтянуть? Пробовал в tsconfig.json указать прямой путь до этой либы в typeRoots, не помогло.
Это, фактически, даже не сборка, просто когда импортируем через "import from @vendor/module" берется из dist.
Тогда чему вы удивляетесь? Чтобы ваш модуль использовать, TS должен его обработать, а в этом модуле импортируется Dayjs. В таком случае в текущем исполнении ваш пакет имеет обычную (т.е. транзитивную) зависимость от Dayjs. Причём и от пакета с типами тоже! (если он отдельно).
Т.е. в Utils пакет с библиотекой и её типами (если они отдельно) должны быть ОБЫЧНЫМИ зависимостями.