#reactjs #typescript #next.js #monorepo #nrwl-nx
Вопрос:
Я искал в Интернете, чтобы попытаться найти хорошее решение своей проблемы, но до сих пор этого не сделал.
У меня есть монорепо NX с NextJS, и я пытаюсь создать глобальную types/
папку, которую могли бы использовать все мои приложения и библиотеки.
Я думал, что это будет довольно просто, я добавлю папку в корень и помещу туда все свои .d.ts
файлы. Затем в tsconfig.base.json я бы добавил
"typeRoots": [
"node_modules/@types",
"node_modules/next/types",
"types/"
]
Я надеялся, что все будет так просто.
Позволяя мне использовать свой набор текста в любом месте монорепо без необходимости их импорта.
К сожалению, это не сработало. После долгих возни мне удалось заставить его работать, но только в том случае, если types/
папка находилась внутри приложения, например:
apps/
/myApp/
/types/ <- types here were detected
types/ <- types here were not detected
tsconfig.base.json
Это не подходит для меня, так как это означало бы, что мне придется дублировать свои типы во всех приложениях и библиотеках.
Официальная рекомендация NX-добавить новую библиотеку только для хранения ваших типов, а затем импортировать ее и использовать в каждом из ваших приложений и библиотек, но мне это кажется действительно неуклюжим. Кроме того, это на самом деле не работает с идеей добавления его typeRoots
в tsbase.config.json
Если кто-нибудь знает лучший способ, как это можно сделать, я хотел бы услышать об этом.
Ваше здоровье.
Ответ №1:
Борюсь с той же проблемой прямо сейчас. До сих пор это работает для моего проекта, но это все еще не идеальное решение. Я бы предпочел иметь глобального провайдера.
apps/
/myApp/
tsconfig.app.json
types/ <- add your .d.ts files here
tsconfig.base.json
в tsconfig.app.json
каждом приложении добавьте следующее:
"include": ["../../types/**/*.d.ts"]
Это приведет к импорту всех определений типов, хранящихся в глобальной папке. Но конфигурация все равно должна обрабатываться вручную в каждой библиотеке и приложении.
Дайте мне знать, если это полезно или если вы нашли лучшее решение.
Ответ №2:
Я решил эту проблему в своем репо следующим образом: в tsconfig.base.json
добавлении "./types
"typeRoots"
.
"typeRoots": [..., "./types", ...]
Каждый тип (в tsconfig "types"
), на который вы хотите ссылаться, должен находиться в отдельной папке в index.d.ts
файле:
types/my-own-module/index.d.ts
Затем вы можете добавить типизацию в tsconfigs ( tsconfig.lib.json
, `tsconfig.app.json в каждом проекте:
"types": [..., "my-own-module", ...]
Единственным недостатком является то, что вам нужно добавлять типы в каждый нужный вам проект, это не работает глобально, потому что обычно каждый проект имеет разные конфигурации «типов».
Непроверенная идея состоит в том, чтобы удалить «типы» из всех конфигураций и просто добавить все необходимые типы в глобальный tsconfig.
Комментарии:
1. Вам нужно создать каталог индекс.d.ts для каждого отдельного типа, который вы хотите объявить глобально? O. o
2. Нет, вы можете иметь столько типов, сколько хотите, в одном файле index.d.ts, но я ссылаюсь на тип, как в массиве tsconfig «типы».