如果esModuleInterop是true,那么我是否需要显式的allowSyntheticDefaultImports来配置TypeScript转换?

时间:2018-09-30 08:38:10

标签: javascript typescript webpack-4 typescript3.0

我需要对以下理论进行确认。根据{{​​3}},可以在 tsconfig.json 中设置两个选项。

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

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

当我四处搜寻时,我会看到两者都设置为 true (至少在我要针对的行为方面)。但是,据我所知,文档,TS和向JS的移植都没有意义。

我认为,我可能只使用后者,而完全删除了前者。但是,由于谨慎而谦虚,我不能完全确定并担心我正在做一些不太明亮的事情,但现在还没有意识到。

我担心这是不适当的事情,稍后会在驴中咬我,造成数小时的哀叹和拔毛,同时还要进行麻烦的解决。怀疑的基础是两个选项均可用,因此我推断在四种情况下都需要所有组合( true / false 等),但我无法想象它们是。

如果 compilerOptions 中的-esModuleInterop:true ,跳过-allowSyntheticDefaultImports 是否完全安全?如果是这样,为什么我们有这个选择呢?

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

3 个答案:

答案 0 :(得分:5)

如果您是想让allowSyntheticDefaultImports保持未定义状态而仅定义esModuleInterop,那么答案应该是“是”,但这存在问题。 PR #26866似乎是一种解决方法,仅在9月17日才合并,因此短期内可能会有一定风险。

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

答案 1 :(得分:2)

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

根据文档,如果您启用了allowSyntheticDefaultImports,则无需显式指定esModuleInterop,但是我也必须启用allowSyntheticDefaultImports的原因是Resharper看上去在Visual Studio中进行语法检查时,在该标志处。当然,仅使用esModuleInterop就可以构建并正常运行,但是我从Resharper那里收到了很多红色警告,直到我同时启用了另一个标志。

答案 2 :(得分:0)

根据这里的相关文档:https://webpack.js.org/guides/typescript/,这两个选项具有不同的意义。根据项目代码和依赖库语法,可能需要其中一个/两个选项。 enter image description here