Понимание "baseUrl" и "путей" в TypeScript с помощью * glob

У меня есть монорепозиторий, созданный с рабочими пространствами пряжи и следующей структурой папок:

├── foo                   (workspace @project/foo)
│   ├── package.json
│   └── src
│       └── index.ts
├── bar                   (workspace @project/bar)
│   ├── package.json
│   └── src
│       └── index.ts
├── package.json          (monorepo root)
└── tsconfig.json         (base tsconfig)

И следующие настройки в tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": ".",
    "module": "commonjs",
    "paths": {
      "@project/foo/*": "./packages/foo/src/*",
      "@project/bar/*": "./packages/bar/src/*"
    },
    ...
  }
}

в @project/bar рабочее пространство, я хочу импортировать модули из @project/foo:

import foo from "@project/foo";

Но я получаю следующую ошибку:

Не удается найти модуль '@project/foo' или соответствующие объявления типа.ts(2307)

Если я удалю *символы из ключей и значений объекта "пути", код компилируется. Почему это? Как я могу сохранить* glob pattern и сделать не относительный импорт в мои локальные модули?

1 ответ

Корни следует определять отдельно, потому что / блоки @project/foo из импорта, только @project/foo/ а также @project/foo/something разрешается.

"@project/foo": "./packages/foo/src",
"@project/bar": "./packages/foo/bar",
"@project/foo/*": "./packages/foo/src/*",
"@project/bar/*": "./packages/bar/src/*"

В случае монорепозитория нельзя использовать /* потому что после компиляции он не будет доступен так же, как во время выполнения в монорепозитории.

Правильный способ - указать на public_api проектов

"@project/foo": "./packages/foo/src/public_api",
"@project/bar": "./packages/foo/bar/public_api",

То же и для подпроектов:

"@project/foo/sub": "./packages/foo/src/sub/public_api",
Другие вопросы по тегам