Typescript:使用符号链接时解析相对导入路径

问题描述 投票:0回答:1

这似乎是一个愚蠢的问题,但我很难找到答案。

情况

这是我的文件夹结构:

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

可以这样使用符号链接吗?如果不是,还有其他(简单的)替代方案吗?

javascript node.js typescript symlink monorepo
1个回答
0
投票

默认情况下,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 是符号链接还是常规文件,这都应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.