簡體   English   中英

將現有 NodeJS 項目轉換為 TypeScript 時如何強制將所有文件視為模塊

[英]How to force all files to be treated as modules when converting an existing NodeJS project to TypeScript

我是 TypeScript 的新手,正在研究將一個大型的、現有的符合 ES2017 的 NodeJS 代碼庫遷移到它。

這是我的tsconfig.json的樣子:

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

如果我將所有.js文件重命名為具有.ts擴展名,我會遇到此問題並從tsc看到很多Cannot redeclare block-scoped variable錯誤,因為 TypeScript 似乎無法判斷我的文件是否是模塊(每個文件都有自己的范圍) 或腳本(都共享一個范圍)。

這些“虛擬”/死記硬背的錯誤使我無法看到其他真正的錯誤,這些錯誤需要作為 TypeScript 遷移的一部分進行修復。

所以,我的問題是,作為將現有 JavaScript 代碼庫遷移到 TypeScript 的一部分,解決此問題的最明智和正確的方法是什么?

我想到了兩個選擇:

  1. 啟用allowJs並慢慢將每個.js文件一次一個地重命名為.ts ,在重命名每個文件時調整每個文件的imports / exports ,以向 TypeScript 表明該文件是一個模塊並且不會與其他文件沖突.ts文件。 (現有的.js文件將不受影響地復制過來。)

  2. 將所有.js文件重命名為.ts並放置一個固定export {}; 在每個文件中作為起點。 這似乎並不理想。

這些選項似乎都不理想。 有沒有更直接的方法告訴tsc將所有文件視為模塊以防止它認為它們將共享相同的 scope?

從 TypeScript 4.7 開始,這是通過 tsconfig.json 中的"moduleDetection": "force"解決的:

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

參考: https://www.typescriptlang.org/tsconfig#moduleDetection

驅動此配置的原始 Github 問題: https://github.com/microsoft/TypeScript/issues/14279

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM