Монорепозиторий с путями из Typescript не работает
У меня есть monorepo (рабочие пространства пряжи) со следующей файловой структурой:
├── client (workspace @client)
│ ├── package.json
│ └── tsconfig.json (extended tsconfig)
├── server (workspace @server)
│ ├── getData.ts
│ ├── package.json
│ └── tsconfig.json (extended tsconfig)
├── shared
│ └── sanitizeData.ts
├── package.json (monorepo root)
└── tsconfig.json (base tsconfig)
И я хочу использовать функцию из shared/sanitizeData.ts
в server/getData.ts
Я пытался использовать paths
из Typescript, согласно документации, это выглядит довольно просто, но я делаю что-то не так:
error TS2307: Cannot find module '@shared/sanitizeData'.
server/tsconfig.json
:
{
"extends": "../tsconfig.json",
"compilerOptions": {
"baseUrl": ".",
"rootDir": "../",
"outDir": "build",
"paths": {
"@shared/*": ["shared/*"]
}
}
}
server/getData.js
:
import { sanitizeData } from "@shared/sanitizeData";
Не могли бы вы мне помочь, пожалуйста?
2 ответа
Пути относительно baseUrl
, поэтому в вашем случае вам придется заменить ["shared/*"]
с ["../shared/*"]
Определите baseUrl только в корневом файле tsconfig, чтобы избежать сложностей с перебазированием. Затем ссылается на все пути из baseurl.
Помните: свойство paths не объединяет записи из нескольких файлов tsconfig... как подразумевает аргумент «extends». Пути базового tsconfig перезаписываются путями в производном tsconfig.
Итак, вам придется скопировать/переместить пути из базового tsconfig в любые производные файлы tsconfig.
И не забудьте украсить любой псевдоним пути символом «@», чтобы его можно было отличить от других относительных путей. Я говорю это, потому что импорт из «commonlib/src» не является очевидным псевдонимом пути и может быть просто относительным путем из локального src. Но «@commonlib/src» легко распознается как псевдоним пути, поскольку «@» не является допустимым начальным символом папки/файла.