從 tsc 遷移
如果您從 TypeScript 編譯器 (tsc) 遷移,有幾件事需要記住。
TypeScript 版本
SWC 支援最新的穩定 TypeScript。
isolatedModules: true
SWC 以逐檔案方式運作,因此任何需要了解完整類型系統的程式碼轉換都無法運作。
如果您遇到這些限制,某些 TypeScript 功能(例如 const 列舉和命名空間)可能會導致執行時期問題。
在這種情況下,使用 TypeScript 中的 isolatedModules
(在新分頁中開啟) 標記可以協助您警告任何 SWC 可能無法正確解釋的程式碼。
請參閱 相關問題的留言(在新分頁中開啟) 以取得更多詳細資訊。
importsNotUsedAsValues: "error"
由於上述原因,SWC 無法完全辨別匯入繫結是 值
還是 類型
。
將此 importsNotUsedAsValues
(在新分頁中開啟) 選項設定為 error
將確保 TypeScript 在類型檢查期間正確標記所有類型匯入為 類型
,從而準確地將它們移除 SWC。
esModuleInterop: true
TypeScript 的匯入互通性偏離了 ES6 模組規格。
另一方面,SWC 採用類似於 Babel(有時可能更嚴格)的方法。
啟用這個 esModuleInterop(在新分頁中開啟) 選項可確保 tsc 的行為與 SWC 保持一致。
verbatimModuleSyntax: true
這是 TypeScript 5.0 中引入的新選項,用於取代 isolatedModules
、preserveValueImports
和 importsNotUsedAsValues
。請查看 版本說明(在新分頁中開啟) 以取得更多詳細資訊。
useDefineForClassFields
此問題涉及 [[Define]]
和 [[Set]]
的語意。
誰不需要注意這一點?
- 從不使用類別的人。
- 使用類別但從不使用繼承的人。
誰需要特別注意這件事?
- 裝飾器使用者。
如果值已經在您的 tsconfig.json
中設定,那麼相同的數值可以在 swc 的組態中使用。
如果它尚未設定,而您遇到問題,那麼您有必要補充這個設定。
請注意,這個選項的預設值會根據您的 tsconfig.json
的 target
而改變。
請查看 useDefineForClassFields(在新分頁中開啟) 選項。
如果 target 是 ES2022 或更高,包括 ESNext,則為 true,否則為 false。
已知問題
- TypeScript#16166(在新分頁中開啟) tsc 沒有提升 ES6 匯入。如果您依賴錯誤的 tsc 實作,您在移轉到 swc 時可能會遇到問題,因為 swc 更嚴謹地保留 ES 模組語意。
注意事項
SWC 只會轉譯程式碼,不會執行類型檢查。因此,建議您繼續使用 tsc 來偵測任何類型錯誤。