从 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(在新标签页中打开) ES6 导入不会被 tsc 提升。如果您依赖错误的 tsc 实现,则在迁移到 swc 时可能会遇到问题,因为 swc 更严格地保留了 ES 模块语义。
备注
SWC 仅转换代码,不执行类型检查。因此,建议您继续使用 tsc 来检测任何类型错误。