Монорепозиторий с путями из 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» легко распознается как псевдоним пути, поскольку «@» не является допустимым начальным символом папки/файла.

Другие вопросы по тегам