首页 > 解决方案 > 如果 esModuleInterop 是 true 配置 TypeScript 转换,我是否需要明确的 allowSyntheticDefaultImports?

问题描述

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

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

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

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

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

我担心这是不恰当的事情,稍后会在驴子上咬我,导致数小时的哀叹和拉扯头发,同时拼命解决问题。怀疑的基础是这两个选项都可用,所以我推断有四种情况需要所有组合(真/假等),但我无法想象它们是哪一种。

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

额外的问题:这两个选项何时需要所有四种组合(true/false )?

标签: javascripttypescriptwebpack-4typescript3.0

解决方案


如果你的意思是你可以留下allowSyntheticDefaultImportsundefined 和 define only esModuleInterop,那么答案应该是 YES ,但这个问题一直存在。 PR #26866似乎是一个修复,仅在 9 月 17 日合并,因此短期内可能存在一些风险。

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


推荐阅读