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

538*_*MEO 10 javascript symlink node.js typescript monorepo

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

\n

情况

\n

这是我的文件夹结构:

\n
myProject/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module1/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 init.ts #symlink\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module2/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 init.ts #symlink\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 symlinks/\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 init.ts # the real not duplicated file\n
Run Code Online (Sandbox Code Playgroud)\n

文件init.js导入本地文件,如下所示:

\n
import config from \'./config\'\n\n// ...\n
Run Code Online (Sandbox Code Playgroud)\n

问题

\n

问题是打字稿抛出Cannot find module \'./config\' or its corresponding type declarations

\n

我尝试使用打字稿选项preserveSymlinks但它没有解决我的问题

\n

我知道实现我的目标的其他方法,但对于一个文件来说它太过分了,而且它不能解决相对路径上的中继问题(比如创建一个 npm 模块,创建一个函数并传递相对文件内容作为参数,甚至在运行时生成文件...)

\n

=> 我正在monorepo中使用typescript

\n

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

\n

编辑:我已经制作了这个示例仓库,您可以使用它作为实验的基础

\n

Jul*_*ipe -1

默认情况下,TypeScript 根据文件的物理路径解析模块,而不是遵循任何符号链接后解析的路径。因此,在您的情况下,当您尝试config从导入时,TypeScript 会在物理路径或./config处查找文件,但它实际上位于。myProject/module1/config.tsmyProject/module2/config.tsmyProject/symlinks/config.ts

您可以通过在 tsconfig.json 文件中设置resolveSymlinks选项来告诉 TypeScript 根据解析的路径解析模块:true

{
  "compilerOptions": {
    // ...
    "resolveSymlinks": true
  },
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这将导致 TypeScript 在解析模块时遵循符号链接,因此它应该能够找到您的config文件。请注意,如果您使用 Webpack 等可能会更改解析路径的工具,则可能还需要设置preserveSymlinks为。true

另一种选择是在 tsconfig.json 文件中使用模块别名将./config路径映射到正确的位置。例如:

{
  "compilerOptions": {
    // ...
    "baseUrl": ".",
    "paths": {
      "*": ["*", "symlinks/*"]
    }
  },
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这将告诉 TypeScript 在目录及其原始位置中查找所有模块symlinksconfig然后,您可以像这样导入:

import config from 'module1/config';
Run Code Online (Sandbox Code Playgroud)

无论 init.ts 是符号链接还是常规文件,这都应该有效。

  • “compilerOptions”中不存在“resolveSymlinks”。 (4认同)
  • 这个答案与AI生成的非常相似。如果只是因为 tsconfig 中不存在(并且从未存在过)resolveSymlinks (3认同)