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/**/*
中的所有声明,在您的情况下,包括依赖于 >= 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
,例如具有所需 lib
的 tsconfig.test.json
=> 我认为这是您的解决方案;
【讨论】:
我会试试这个,但jest
与原始tsconfig.json
运行良好,而我的正常编译tsc
会中断。我原以为情况会相反。同样在tsconfig.test.json
中进行更改仍然会影响我的项目,对吗?因为我的测试从我的项目中导入代码。
好的,我明白了,所以我认为在您的“正常”tsconfig
中您可能必须忽略 babel__template
类型,并且不要在您的“测试”tsconfig
中忽略它。跨度>
是的,但我宁愿避免。我不明白为什么 devDependency 的嵌套依赖项需要我更新生产编译。
在开发和测试之间使用不同的tsconfig
会影响您的项目,是的,因为配置的不同会导致不一致。我看到的唯一解决方案,否则传递给es6
,是使用旧版本的jest
,它完全是es5
。以上是关于tsc 找不到名称 `Set` 开玩笑的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 TSC - 读取文件“anything.ts”时出错:找不到文件