Typescript 这个问题是否正确地针对巴贝尔玩笑提出?

Typescript 这个问题是否正确地针对巴贝尔玩笑提出?,typescript,next.js,babeljs,babel-jest,transpiler,Typescript,Next.js,Babeljs,Babel Jest,Transpiler,我对jest项目提出了一个问题,我认为它负责维护babel jest。在添加明显无害且无错误的代码后,Transpilation完全失败 然而,在下一个项目中,Typescript的透明有很多层,因此我不确定这是否是提交问题的正确位置,是否与失败的可能来源相匹配 这个问题似乎与babel jest项目相匹配,还是我应该将它归档到其他地方 臭虫 我在一个复杂的Next Typescript项目中发现,在一个文件中添加几行就足以破坏babel jest转换,并在一个完全不同的文件中创建运行时错误 在

我对jest项目提出了一个问题,我认为它负责维护babel jest。在添加明显无害且无错误的代码后,Transpilation完全失败

然而,在下一个项目中,Typescript的透明有很多层,因此我不确定这是否是提交问题的正确位置,是否与失败的可能来源相匹配

这个问题似乎与babel jest项目相匹配,还是我应该将它归档到其他地方

臭虫

我在一个复杂的Next Typescript项目中发现,在一个文件中添加几行就足以破坏babel jest转换,并在一个完全不同的文件中创建运行时错误

在commit 04c4c7b中,在检查干净项目和运行纱线后,我能够通过纱线运行测试。传递的源树位于

然而,在添加了您可以看到的少量行之后,babel jest transpiler似乎有效地中断了测试,使测试无法运行,并且一个完全不相关的文件在测试期间开始出现运行时错误,这与

ReferenceError: Cannot access 'SCORERS' before initialization

      47 |   sortedEntries.sort((a: Immutable<Entry>, b: Immutable<Entry>) => {
      48 |     for (const scoreName of scorePriority) {
    > 49 |       const scorer = SCORERS[scoreName]
         |                      ^
      50 |       const diff = scorer(b) - scorer(a)
      51 |       if (diff !== 0) {
      52 |         return diff

      at sort (src/util.tsx:49:22)
          at Array.sort (<anonymous>)
      at sortEntries (src/util.tsx:47:17)
      at Object.<anonymous> (src/logic.ts:10:20)
      at Object.<anonymous> (src/components/controls/Buttons.tsx:6:1)
      at Object.<anonymous> (src/components/Controls.tsx:8:1)
      at Object.<anonymous> (src/components/index.ts:1:1)
      at Object.<anonymous> (src/util.tsx:6:1)
      at Object.<anonymous> (test/util.test.ts:3:1)
注意,commit 25703fc使用tsc编译,运行良好,似乎功能正常

这个错误毫无意义,因为SCORERS是在函数定义上方的模块闭包中定义的常量

它也是一个与commit 25703fc中更改的文件完全无关的文件,这表明commit 25703fc中的语言构造将transpiler推到了错误状态

最后,它是一个文件中的运行时错误,该文件已经被使用,并且在生产环境中运行良好,因此我不认为它实际上存在任何类型脚本错误

我应该用babel或者nextjs来解决这个问题,或者这是一个babel的玩笑问题,还是其他项目

有没有人知道一个变通方法,比如使用一个完全不同的巴贝尔系统来传输Typescript nextjs代码,以防我能证明巴贝尔玩笑在这里是错的

通过“证明”,您可以看到在生产环境中编译并运行的代码,尽管在

下图显示了实际更改的行,这些行将transpiler推到了错误的位置,这是来自提交的github diff的屏幕截图


通过添加新的

import { INITIAL_APPSTATE } from '../../logic'
在Button.tsx中导入。您可以在发布错误的堆栈跟踪中看到它

  at sort (src/util.tsx:49:22)
  at Array.sort (<anonymous>)
  at sortEntries (src/util.tsx:47:17)
  at Object.<anonymous> (src/logic.ts:10:20)
  at Object.<anonymous> (src/components/controls/Buttons.tsx:6:1)
  at Object.<anonymous> (src/components/Controls.tsx:8:1)
  at Object.<anonymous> (src/components/index.ts:1:1)
  at Object.<anonymous> (src/util.tsx:6:1)
  at Object.<anonymous> (test/util.test.ts:3:1)
您的测试加载util.tsx,它导入组件/index.ts等等,直到加载Buttons.tsx,由于您的补丁,Buttons.tsx现在导入logic.ts,logic.ts然后再次导入util.tsx,但是由于您的代码是从导入util.tsx开始的,它还没有完成执行,因为它仍然在加载所有依赖项。当Button.tsx尝试导入logic.ts时,它调用sortEntries,但该函数依赖于util.tsx是否正确执行,而且它还没有时间这样做


您需要重新组织代码,以避免依赖项中出现此循环。一个名为util的文件会导入一个组件,因此将downloadPdf移动到它自己的downloadPdf.ts中,这样util.ts就不再需要从“/components”导入{Resume}了,这似乎是一个非常令人惊讶的解决方案。

这非常有用,谢谢!我一直在使用madge来尝试消除循环,因为运行它会发现没有循环npx madge-circular test/util.test.ts,但我也应该仔细查看导入序列。更新我发现,如果顶级tsconfig被指定为npx madge-circular-ts config这样的参数,madge会检测到循环tsconfig.json-扩展名ts,tsx./。不幸的是,npx madge-circular-ts config tsconfig.jest.json-extensions ts,tsx./指向或省略了-ts config参数,因为我之前运行它时没有发现这种特殊的循环性。