tsc からの移行
TypeScript コンパイラ (tsc) から移行する場合、いくつか考慮すべき点があります。
TypeScript のバージョン
SWC は最新の安定版 TypeScript をサポートしています。
isolatedModules: true
SWC はファイル単位で動作するため、完全な型システムの理解に依存するコード変換は機能しません。
これらの制限に遭遇した場合、定数列挙型や名前空間などの特定の TypeScript 機能が実行時問題を引き起こす可能性があります。
この場合、TypeScript のisolatedModules
(新しいタブで開きます) フラグを使用すると、SWC によって正しく解釈されない可能性のあるコードについて警告を表示できます。
詳細については、関連するissueのコメント (新しいタブで開きます) を参照してください。
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 (新しいタブで開きます) ES6 インポートは tsc によってホイスティングされません。誤った tsc 実装に依存している場合、swc は ES モジュールのセマンティクスをより厳密に保持するため、swc への移行時に問題が発生する可能性があります。
備考
SWC はコードをトランスパイルするだけで、型チェックは実行しません。したがって、型エラーの検出には tsc を引き続き使用することをお勧めします。