我需要确认以下理论。根据 TS 文档,可以在 tsconfig.json 中设置两个选项。
–allowSyntheticDefaultImports: 允许从没有默认导出的模块中默认导入。这不会影响代码发出,只会影响类型检查。
–esModuleInterop: 发出 __importStar 和 __importDefault 助手以实现运行时 babel 生态系统兼容性,并启用 –allowSyntheticDefaultImports 以实现类型系统兼容性。
当我四处搜索时,我看到两者都设置为 true (至少就我所针对的行为而言)。然而,就我对文档、TS 和 JS 的理解而言,同时使用它们是没有意义的。
我认为,我可能只使用后者并完全删除前者。然而,出于谨慎和谦虚,我并不完全确定并担心我现在正在做一些不那么光明的事情而没有意识到。
我担心这是一些不合适的东西,它会在以后拼命解决问题时引起我数小时的哀叹和拔毛。怀疑的基础是两种选择都可用,所以我推断有四种情况需要所有组合( 真/假 等),但我无法想象它们是哪一种。
如果 –esModuleInterop: true 在 compilerOptions 中跳过 –allowSyntheticDefaultImports 是否完全安全?如果是这样,为什么我们有这个选择?
奖金问题:这两个选项的所有四种组合( _真/假_)什么时候需要?
原文由 Konrad Viltersten 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您的意思是您可以离开
allowSyntheticDefaultImports
未定义并仅定义esModuleInterop
,答案应该是“是”,但这个问题一直存在。 PR #26866 似乎是一个修复,9 月 17 日才合并,因此短期内可能存在一些风险。至于为什么两者都存在,我相信它们都是解决导入 Babel 转译模块的兼容性问题的一部分,原始 PR 向某些编译时消息添加了 allowSyntheticDefaultImports 选项,但实际上并没有解决运行时行为进口。所以后来添加了–esModuleInterop。有关如何更新文档的讨论,请参阅 TypeScript-Handbook/#816 …