如何在将现有NodeJS项目转换为TypeScript时强制将所有文件视为模块

jogvjijk  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(122)

我是TypeScript的新手,正在研究如何将现有的大型ES 2017兼容NodeJS代码库迁移到TypeScript。
下面是我的tsconfig.json的外观:

{
    "compilerOptions": {
        "module": "commonjs",
        "moduleResolution": "node",
        "outDir": "./built",
        "allowJs": true,
        "target": "ES2017",
    },
    "include": [
        "**/*"
    ],
    "exclude": [
        "**/node_modules/**/*",
        "built"
    ]
}

如果我将所有.js文件重命名为.ts扩展名,我会遇到this issue,并看到许多来自tscCannot redeclare block-scoped variable错误,因为TypeScript似乎无法区分我的文件是模块(每个都有自己的作用域)还是脚本(都共享一个作用域)。
这些“虚拟”/死记硬背的错误使我看不到其他真正的错误,这些错误需要作为TypeScript迁移的一部分进行修复。
因此,我的问题是,作为将现有JavaScript代码库迁移到TypeScript的一部分,解决这个问题的最明智和正确的方法是什么?
我想到了两个选择:
1.保持allowJs处于启用状态,慢慢地将每个.js文件重命名为.ts(一次一个),在重命名每个文件时调整每个文件的imports/exports,以向TypeScript表明该文件是一个模块,不会与其他.ts文件冲突(现有的.js文件将不受影响地复制过来)。
1.将所有.js文件重命名为.ts,并在每个文件中放入一个固定的export {};作为起点,这似乎并不理想。
这两个选项似乎都不理想,有没有更直接的方法告诉tsc将所有文件都视为模块,以防止它认为这些文件将共享相同的作用域?

pbossiut

pbossiut1#

从TypeScript 4.7开始,这个问题可以通过tsconfig.json中的"moduleDetection": "force"解决:

{
  "compilerOptions": {
    // ... Various options here, such as module ...
    "moduleDetection": "force"
  }
}

Reference: https://www.typescriptlang.org/tsconfig#moduleDetection
导致此配置的原始Github问题:https://github.com/microsoft/TypeScript/issues/14279

相关问题