allowSyntheticDefaultImports

allowSyntheticDefaultImports

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

  • --allowSyntheticDefaultImports:允许从模块进行默认导入,而没有默认导出。这不影响代码发出,仅影响类型检查。
  • --esModuleInterop:发出__importStar和__importDefault帮助程序以实现运行时babel生态系统兼容性,并启用--allowSyntheticDefaultImports以实现类型系统兼容性。

  • 当我在Google上搜索时,我会看到两者都设置为true(至少就我要针对的行为而言)。但是,据我所知,文档,TS和向JS的转译都没有意义。

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

    我担心这是不适当的事情,稍后会在驴中咬我,造成数小时的哀叹和拔毛,同时还拼命地排除故障。怀疑的基础是两个选项均可用,因此我推断在四种情况下都需要所有组合(对/错等),但我无法想象它们是哪种。

    如果在编译器选项中--esModuleInterop:true为真,跳过--allowSyntheticDefaultImports是否完全安全?如果是这样,为什么我们有这个选择呢?

    额外的问题:这两个选项的全部四个组合(对/错)何时需要?

    最佳答案

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

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

    10-02 17:30