这似乎是一个愚蠢的问题,但我很难找到答案。
这是我的文件夹结构:
myProject/
├── module1/
│ ├── config.ts
│ └── init.ts #symlink
├── module2/
│ ├── config.ts
│ └── init.ts #symlink
└── symlinks/
└── init.ts # the real not duplicated file
文件
init.js
像这样导入本地文件:
import config from './config'
// ...
问题是打字稿抛出
Cannot find module './config' or its corresponding type declarations
我尝试使用打字稿选项
preserveSymlinks
但它没有解决我的问题
我知道实现我的目标的其他方法,但它对一个文件来说太过分了,而且它不能解决在相对路径上的中继问题(比如创建一个 npm 模块,创建一个函数并将相关文件内容作为参数传递,甚至在运行时...)
=> 我正在 monorepo 中使用 typescript。
可以这样使用符号链接吗?如果不是,还有其他(简单的)替代方案吗?
默认情况下,TypeScript 根据文件的物理路径解析模块,而不是遵循任何符号链接后的解析路径。因此,在您的情况下,当您尝试从
config
导入 ./config
时,TypeScript 在物理路径 myProject/module1/config.ts
或 myProject/module2/config.ts
查找文件,但它实际上位于 myProject/symlinks/config.ts
.
您可以通过在 tsconfig.json 文件中将
resolveSymlinks
选项设置为 true
来告诉 TypeScript 根据解析路径解析模块:
{
"compilerOptions": {
// ...
"resolveSymlinks": true
},
// ...
}
这将导致 TypeScript 在解析模块时遵循符号链接,因此它应该能够找到您的
config
文件。请注意,如果您使用像 Webpack 这样可能会改变解析路径的工具,您可能还需要将 preserveSymlinks
设置为 true
。
另一种选择是在 tsconfig.json 文件中使用模块别名将
./config
路径映射到正确的位置。例如:
{
"compilerOptions": {
// ...
"baseUrl": ".",
"paths": {
"*": ["*", "symlinks/*"]
}
},
// ...
}
这将告诉 TypeScript 查找
symlinks
目录中的所有模块,以及它们的原始位置。然后,您可以像这样导入config
:
import config from 'module1/config';
无论 init.ts 是符号链接还是常规文件,这都应该有效。