Объявления глобальных типов в монорепо NX и NextJS

#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 «типы».