tsc 找不到名称 `Set` 开玩笑

Posted

技术标签:

【中文标题】tsc 找不到名称 `Set` 开玩笑【英文标题】:tsc cannot find name `Set` with jest 【发布时间】:2019-12-28 00:16:57 【问题描述】:

我有打字稿编译设置,编译工作完美。

然后我将jest(一个测试框架)安装为devDependency。这仅用于开发(因此它是 devDependency),不应成为编译包的一部分。

现在编译会导致以下错误:

node_modules/@types/babel__template/index.d.ts:16:28 - error TS2583: Cannot find name 'Set'. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.

16     placeholderWhitelist?: Set<string>;

能否解决此错误,如果可以,如何解决?添加 "lib": ["es6"] 不是可接受的解决方案,因为 jest 的实现细节不应该要求我像这样修改我的编译器选项。另请注意,jest 运行良好。如果没有其他解决方案,那么这是一个可以接受的答案。

为什么tsc 编译devDependencies,我该如何阻止它?我不明白为什么我突然要担心嵌套的 babel devDependency 会影响我的编译。


编辑:tsconfig.json


  "compilerOptions": 
        "target": "es5",
        "module": "commonjs",
        "sourceMap": true,
        "rootDir": "./src",
        "outDir": "./build",

        "strict": true,
        "esModuleInterop": true
    ,
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "/src/**/?(*.)test.ts"
    ]


注意:这不是与node_modules/@types/babel _template/index.d.ts :16:28 - error TS2583: Cannot find name 'Set'的重复

这个问题是在问为什么 tsc 正在查看 node_modules,这与我的问题不同(并且接受的答案是针对该问题的)。

【问题讨论】:

所以您刚刚添加了 Jest 并且捆绑失败了?没有对 package.json 或 .babelrc 进行任何更改? 是的,没有变化。我没有.babelrc,但错误来自 babel,大概是 jest 正在使用。 请问您可以发布您的tsconfig.json 吗? 【参考方案1】:

为什么 tsc 编译 devDependencies 以及如何阻止它?我不明白为什么我突然要担心嵌套的 babel devDependency 会影响我的编译。

默认情况下,tsc 加载 node_modules/@types/**/* 中的所有声明,在您的情况下,包括依赖于 &gt;= es2015 的类型声明。如果该类型声明来自devDependency,则tsc 将包含它。这就是为什么tsc 正在编译与devDependency 相关的内容。

如果升级到es2015 不是一个有效的解决方案,那么您也可以尝试忽略依赖它的特定类型声明。

来自 TypeScript documentation on @types:

默认情况下,所有可见的“@types”包都包含在您的编译中...指定 "types": [] 以禁用自动包含 @types 包。

【讨论】:

是否有专门编译 devDependencies 的原因?它们应该用于开发而不是构建包的一部分,对吧? @DavidCallanan 这不是devDependencies 的具体问题;相反,babel__template/index.d.ts@types 中。 这个 babel 依赖来自开玩笑的 devDependency... 手动配置嵌套依赖似乎不对,它们应该对我隐藏,不是吗? 这对 TypeScript 团队来说是一个合理的要求。 TypeScript GitHub 存储库中存在一个关于手动配置不需要的和可能嵌套的@types 的麻烦:github.com/Microsoft/TypeScript/issues/11917 我认为最好的选择是有一个单独的tsconfig.test.json 扩展tsconfig.json 并添加"types": ["jest"]【参考方案2】:

考虑到您的tsconfig,您可以:

lib 添加到您的compilerOptions,但您不想因为测试库而影响您的项目,我明白这一点;

确保您的测试使用另一个 tsconfig,例如具有所需 libtsconfig.test.json => 我认为这是您的解决方案;

【讨论】:

我会试试这个,但jest 与原始tsconfig.json 运行良好,而我的正常编译tsc 会中断。我原以为情况会相反。同样在tsconfig.test.json 中进行更改仍然会影响我的项目,对吗?因为我的测试从我的项目中导入代码。 好的,我明白了,所以我认为在您的“正常”tsconfig 中您可能必须忽略 babel__template 类型,并且不要在您的“测试”tsconfig 中忽略它。跨度> 是的,但我宁愿避免。我不明白为什么 devDependency 的嵌套依赖项需要我更新生产编译。 在开发和测试之间使用不同的tsconfig 会影响您的项目,是的,因为配置的不同会导致不一致。我看到的唯一解决方案,否则传递给es6,是使用旧版本的jest,它完全是es5

以上是关于tsc 找不到名称 `Set` 开玩笑的主要内容,如果未能解决你的问题,请参考以下文章

打字稿错误:tsc:找不到命令

错误 TS2304:找不到名称“发电机”

找不到 Typescript 编译器:命令“tsc”无效

无法使用 TSC - 读取文件“anything.ts”时出错:找不到文件

即使 tsc 成功解决它,也找不到 Typescript 模块

rxjs 模块在 VS2019 中找不到,但在 tsc cli 中找到