如何在多个 TypeScript 文件中导入相同的 npm 模块?

how*_*d_9 5 javascript commonjs node.js npm typescript

问题:

\n

每当我在多个 TypeScript 文件中导入相同的 npm 模块时,error TS2451: Cannot redeclare block-scoped variable \'os\'一旦运行 TypeScript 编译器,我就会收到错误“” tsc。我的项目设置如下所示。

\n

我正在使用 NodeJS v18.15.0。

\n
\n

设置:

\n

目录结构

\n
Project_Root\n\xe2\x94\x9c\xe2\x94\x80 main.ts\n\xe2\x94\x9c\xe2\x94\x80 worker.ts\n\xe2\x94\x9c\xe2\x94\x80 package.json\n\xe2\x94\x94\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

主要.ts

\n
const worker = require(\'./worker\');\nconst os = require(\'os\');\n\nconsole.log(\'name = \' + worker.getName() );\nconsole.log(\'memory = \' + os.freemem() );\n
Run Code Online (Sandbox Code Playgroud)\n

工人.ts

\n
const os = require(\'os\');\n\nmodule.exports =\n    class worker {\n        static getName() : string { return "worker-" + os.freemem(); }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

包.json

\n
Project_Root\n\xe2\x94\x9c\xe2\x94\x80 main.ts\n\xe2\x94\x9c\xe2\x94\x80 worker.ts\n\xe2\x94\x9c\xe2\x94\x80 package.json\n\xe2\x94\x94\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

tsconfig.json

\n
const worker = require(\'./worker\');\nconst os = require(\'os\');\n\nconsole.log(\'name = \' + worker.getName() );\nconsole.log(\'memory = \' + os.freemem() );\n
Run Code Online (Sandbox Code Playgroud)\n
\n

项目要求:

\n
    \n
  • 要求#1:没有外部包(RequireJS/Babel/Webpack/etc),因为磁盘空间有限。
  • \n
  • 要求#2:IDE 智能感知应该可以工作。我们可以使用任何IDE。
  • \n
  • 要求#3:我们需要使用 CommonJS 风格的“require”关键字进行导入。
  • \n
\n
\n

我尝试过的:

\n

我已经尝试了以下帖子中的前 3 个答案,但没有成功:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n
相关文章结果
错误 TS2451:无法重新声明块作用域变量 \'$\'同样的错误(添加“skipLibCheck:true”标志后)
如何解决这个 Cannot redeclare blockscoped variable \'ngDevMode\'?不适用(我没有使用 Angular)
TS2451:无法重新声明块作用域变量不适用(我没有使用 ESLint)
在 Angular CLI 中出现构建错误:无法重新声明块范围变量 \'ngDevMode\'不适用(我没有使用 Angular)
在 TypeScript 中导入 npm JS 模块不适用(我没有使用 Electron)
\n

gri*_*eel 4

这是因为 TypeScript 不考虑这两个文件模块,并使它们共享其范围。您可以使用moduleDetectiontsconfig 中的字段强制将它们识别为模块:

{
  "compilerOptions": {
    "moduleDetection": "force"
  }
}
Run Code Online (Sandbox Code Playgroud)

TS GitHub Repo 上有关于此的讨论