使用 TypeScript 開發項目時,如何解決模塊解析和聲明文件合并問題?

使用 TypeScript 開發項目時,如何解決模塊解析和聲明文件合并問題?

typescript 模塊解析與聲明文件合并難題

在使用 TypeScript 開發項目,特別是結合 pnpm 包管理工具時,模塊解析和聲明文件合并常常引發問題。例如,假設 math 包在 example 包中正常使用,TypeScript 類型解析無誤。但當嘗試擴展 math 包的 divide 函數聲明時,問題出現。在 example 包中創建 math-extensions.d.ts 文件,試圖通過 declare module 擴展 math 包的類型定義,卻導致模塊覆蓋,vscode 報錯。

問題一:declare module 為什么沒合并聲明?VSCode 報錯原因?

雖然 declare module 理應合并模塊聲明,但 VSCode 報錯可能源于路徑解析問題。假設 tsconfig.JSon 配置如下:

{   "compilerOptions": {     "outDir": "dist",     "baseUrl": ".",     "moduleResolution": "Node",   },   "include": [     "src/**/*"   ] }

TypeScript 使用 Node.js 模塊解析策略 (moduleResolution: “Node”),按照 Node.js 規則查找模塊。由于 math-extensions.d.ts 位于 example 包根目錄,而非 src 文件夾內(include 選項僅包含 src/**/*),TypeScript 編譯器可能無法正確解析該聲明文件。VSCode 也可能使用不同的解析策略,導致無法正確識別和合并模塊聲明。 解決方法是確保聲明文件在 tsconfig.json 的 include 路徑內,或調整 include 選項包含這些聲明文件。

問題二:非相對導入,為什么 math-extensions.d.ts 會生效?

使用非相對導入時,TypeScript 優先查找 node_modules 中的模塊聲明文件。但是,尤其在設置了 baseUrl 后,TypeScript 也會檢查當前工作目錄下的聲明文件。

baseUrl 設置為 “.”,TypeScript 從當前目錄開始查找模塊。因此,math-extensions.d.ts 生效,因為它位于當前目錄且符合 baseUrl 設置。

為了避免模塊覆蓋,建議:

  1. 調整 include 選項: 將 math-extensions.d.ts 包含在 tsconfig.json 的 include 路徑中。
  2. 使用三斜線指令: 在 math-extensions.d.ts 中使用三斜線指令 /// 引用原始 math 包聲明文件,確保聲明合并正確性。
  3. 調整模塊解析策略: 考慮調整 moduleResolution 選項,或明確指定路徑避免沖突。

通過以上方法,即可解決模塊解析和聲明文件合并問題,順利擴展 math 包的類型聲明。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享