首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Jest中运行时,跨Iterable的for..of循环不能工作呢?

为什么在Jest中运行时,跨Iterable的for..of循环不能工作呢?
EN

Stack Overflow用户
提问于 2019-08-15 20:45:13
回答 1查看 622关注 0票数 4

我有以下TypeScript代码:

代码语言:javascript
运行
复制
const myMap = new Map([["name", 5]]);
for (const foo of myMap.values()) {
    console.log(foo);
}

当我在节点(v8.12.0)中直接运行这段代码时,它可以工作,并输出"5“到控制台。

如果我在Jest测试中运行完全相同的代码,它永远不会执行for循环的内容。它运行for条件,然后跳过循环,从来不实际枚举值。

为什么会这样呢?Jest是否使用了JS运行时(不是节点吗?)它不支持for..of而不支持迭代吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-04 06:53:46

经过很长时间的调查,我发现了真相。有关解决方案的重要背景信息:

  1. 当使用ECMAscript编译器针对较早的ES3和ES5版本时,默认情况下不支持使用for..of循环迭代Iterable集合。如果要将for..ofIterable结合使用,则必须针对比ES5更新的对象或使用--downlevelIteration flag
  2. 要在TypeScript项目中使用Jest,可以使用T-玩笑。至少我是。我想你也可以在某种程度上使用babel,但我认为ts是首选
  3. 当使用ts-jest时,默认情况下它尝试使用项目使用的tsconfig.json文件--据我所知,这意味着您正在使用的jest.config.js文件旁边的文件(或者如果您没有指定jest.config.js文件的话是当前目录)。如果无法在项目目录中找到tsconfig.json文件,则使用默认的TypeScript编译器选项。默认编译器选项导致TypeScript编译器以ES3或ES5为目标( 开玩笑的医生声称它默认为ES3,但ts-jest在本例中重写默认值为ES5)。默认情况下,--downlevelIteration不是打开的。

考虑到所有这些,我发现ts-jest无法找到我的项目的tsconfig.json文件,因此它使用默认设置运行我的测试,这意味着以ES5为目标而不允许downlevelIteration,所以我在Iterable上的所有for..of循环都无法工作。它找不到我的tsconfig.json文件的原因是,我的jest.config.js文件位于另一个目录中(树的上层),而且即使我是从一个带有tsconfig.json文件的目录中运行jest,ts-jest并没有查看“当前”目录,而是查看了我为jest.config.js文件所指向的目录,该目录不包含tsconfig.json。

我的解决方案是稍微修改我的目录结构,并利用tsConfig选项 of ts--开玩笑地告诉它在哪里找到我的tsconfig.json文件,这使得tsconfig.json文件“神奇”地工作起来,因为我的tsconfig.json文件目标是es2018,后者支持Iterable上的for..of迭代。

我考虑过但很快被忽略的另一种解决方案是上述tsConfig设置的特性,即在jest配置中直接设置--downlevelIteration编译器选项。我选择不这么做是因为,虽然它会修复这个特定的问题,但它不会修复更大的问题,即Jest测试正在用与我的生产代码不同的标志编译我的TypeScript!正因为如此,只有当前的问题才会导致我的for..of循环痛苦。

一个快速的后记:我最终在这个问题上取得进展的方式是在ts-jest中偶然发现了诊断选项。一旦我将其设置为true,当我尝试运行测试时,会显示如下错误:

TypeScript diagnostics (customize using [jest-config].globals.ts-jest.diagnostics option): src/foo.ts:163:47 - error TS2569: Type 'Map<Guid, FooInfo>' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators.

似乎TS编译器错误应该显示(并导致测试失败),而不管ts-jest“诊断”是否启用,但不要理会。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57516047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档