Понимание "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",