Давайте начнем с тривиальности: если пакет A
нуждается в чем-то из пакета C
, то C
по определению является прямой зависимостью A
.
Вы говорите, что у вас есть причиначтобы не включать C
в зависимости A
, у нас может быть другая цепочка зависимостей, например packageA -> packageD-v1 -> packageC-v2
В этомВ случае, если A
использует типы из C-v1
, как это должно работать?Я вижу только две возможности:
A
не требует типов от C
при использовании packageD
.(кстати, зачем тогда нужны C
типы для использования packageB
?)
C
типы не изменились, поэтому C
типы от C-v1
совместимы с C-v2
Единственное решение, которое я вижу как для № 1, так и для № 2, - это разделение типов из C
на отдельные пакеты, например C-types
,и сделайте его зависимостью от A
.
Типы в C-types
должны , а не быть d.ts
файлами, сгенерированными TypeScript, это должны быть все интерфейсы, типы и перечисления (но не классы, классы - это детали реализациии должен оставаться в C
) из C
, перемещаться в обычный файл .ts
, включенный в отдельный пакет.
Вам нужно будет опубликовать C-types
в репозитории npm так же, как C
публикуется с сгенерированными .d.ts
и пустыми .js
файлами для каждой версии C
.Я не думаю, что наличие пустых .js
файлов является проблемой, но если это так, вы можете просто опубликовать вручную написанные .d.ts
файлы (однако я не знаю, чтобы проверить их перед публикацией, не используя другой пакет, использующийих).Нет необходимости публиковать C-types
- DefinitiveTyped и помещать их в область действия @types
- это просто соглашение, а не требование.Вы просто должны сказать всем в вашей организации использовать C-types
вместо @types/C
.
Вы говорите, что с этим подходом
Я все еще вижу много проблем с этим подходомс точки зрения несоответствия версий, конфликта глобальных объявлений или конфликтов имен (это также верно в подходе DefinetelyTyped / types)
Во-первых, во-первых, глобальные объявления настоятельно не рекомендуется - модули были изобретены дляпричина, и каждое имя, используемое где-либо, должно быть явно импортировано откуда-то.
И если ваш A
использует типы из C
, у вас будут точно такие же проблемы с версиями для разных версий C
.Разделение типов из C
просто заставит вас задуматься об этих проблемах заранее, вместо того, чтобы надеяться, что все будет «просто работать».