如果 esModuleInterop 为 true 配置 TypeScript 转译,我是否需要显式 allowSyntheticDefaultImports?

新手上路,请多包涵

我需要确认以下理论。根据 TS 文档,可以在 tsconfig.json 中设置两个选项。

  1. –allowSyntheticDefaultImports: 允许从没有默认导出的模块中默认导入。这不会影响代码发出,只会影响类型检查。

  2. –esModuleInterop: 发出 __importStar 和 __importDefault 助手以实现运行时 babel 生态系统兼容性,并启用 –allowSyntheticDefaultImports 以实现类型系统兼容性。

当我四处搜索时,我看到两者都设置为 true (至少就我所针对的行为而言)。然而,就我对文档、TS 和 JS 的理解而言,同时使用它们是没有意义的。

我认为,我可能只使用后者并完全删除前者。然而,出于谨慎和谦虚,我并不完全确定并担心我现在正在做一些不那么光明的事情而没有意识到。

我担心这是一些不合适的东西,它会在以后拼命解决问题时引起我数小时的哀叹和拔毛。怀疑的基础是两种选择都可用,所以我推断有四种情况需要所有组合( 真/假 等),但我无法想象它们是哪一种。

如果 –esModuleInterop: truecompilerOptions 中跳过 –allowSyntheticDefaultImports 是否完全安全?如果是这样,为什么我们有这个选择?

奖金问题:这两个选项的所有四种组合( _真/假_)什么时候需要?

原文由 Konrad Viltersten 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 705
2 个回答

如果您的意思是您可以离开 allowSyntheticDefaultImports 未定义并仅定义 esModuleInterop ,答案应该是“是”,但这个问题一直存在。 PR #26866 似乎是一个修复,9 月 17 日才合并,因此短期内可能存在一些风险。

至于为什么两者都存在,我相信它们都是解决导入 Babel 转译模块的兼容性问题的一部分,原始 PR 向某些编译时消息添加了 allowSyntheticDefaultImports 选项,但实际上并没有解决运行时行为进口。所以后来添加了–esModuleInterop。有关如何更新文档的讨论,请参阅 TypeScript-Handbook/#816

原文由 Burt_Harris 发布,翻译遵循 CC BY-SA 4.0 许可协议

好吧,我的理解是 allowSyntheticDefaultImports 是为了能够以更简单的方式加载 CommonJS 库,如果你以 es6+ 为目标(在开发时间),而 esModuleInterop 是为了简化这些导入(在运行时)如果你的目标是 AMD(就像我一样)。

根据文档,如果启用了 esModuleInterop allowSyntheticDefaultImports ,则不需要明确指定 —,但我必须同时启用 allowSyntheticDefaultImports -ff-per that Ref7c-ff-的原因在 Visual Studio 中进行语法检查时,似乎会查看该标志。当然,它仅使用 esModuleInterop 构建并正常工作,但在我还启用另一个标志之前,我从 Resharper 收到了很多红色警告。

原文由 Souldrinker 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题