在保持 CommonJS 格式的同时过渡到 TypeScript

Transition to TypeScript while maintaining CommonJS format

我有一个大型 JavaScript 代码库,我想慢慢过渡到 TypeScript。它目前使用 CommonJS 格式设置,在一个完美的世界中,我希望能够一次将一个 .js 文件更改为 .ts

我的 tsconfig.json 看起来像这样:

{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": false,
    "target": "es5",
    "module": "commonjs",
    "noEmit": true,
    "strict": true,
    "resolveJsonModule": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "types": [
      "node"
    ],
  },
  "exclude": [
    "node_modules"
  ]
}

并且我修改了我的启动脚本以使用 ts-node -P tsconfig.json。这似乎一切正常。

我的问题在于将 TS 导入 JS。 正如我提到的,它目前是使用 CommonJS 设置的,所以 module.exportsrequire。例如,file-a.js 需要 file-b.js:

// file-a.js
const { exampleB } = require('../file-b');

// file-b.js
function exampleB() {
  return "Hello World";
}

module.exports = {
  exampleB,
};

当我将 file-b.js 更改为 .ts,解决所有基本类型检查问题,然后启动命令时,我收到来自 file-a.js 的异常 Error: Cannot find module '../file-b'

我假设这是 Typescript 无法解析我的 CommonJS 格式。我是否可以将 TypeScript 配置为使用此格式并允许我在慢慢过渡时将 TS 文件导入 JS?

如果有帮助,我什至可以将我所有的 module.exports = { fn } 更改为 export fn

这是我所做的:

  1. 已创建 some_folder,其中包含 tsconfig.jsonfile-a.js/(*)file-b.js。全部包含您提供的内容。
  2. npm install -D ts-node
  3. npm install -D typescript
  4. npm install -D @types/node
  5. '/home/.../some_folder/node_modules/.bin/ts-node' -P tsconfig.json file-a.js 成功了。
  6. 已将 file-b.js 重命名为 file-b.ts
  7. 运行 '/home/.../some_folder/node_modules/.bin/ts-node' -P tsconfig.json file-a.js 再次......它也工作得很好。

因此,您要么需要为问题添加更多上下文,以便重现您面临的问题,要么从创建 "template" Typescript 开始项目和我复制的项目一样简单。确保它有效,然后才开始从您的原始项目中添加文件。可能在某处你在一个看似无关的地方做了一些更改,只是看不到它。

(*) 在你的问题中你写的是 ../file-b 而不是 ./file-b。但是为了清楚起见,我跳过了这个细节。但我也尝试将 file-b 放在项目文件夹之外,并尝试将 file-a 放在子文件夹中。一切正常。