我遇到过想要在node_modules目录中包含部分但不是全部@types的情况。
背景
我的tsconfig.json
看起来像这样:
{
"compilerOptions": {
"module": "system",
"target": "es5",
"sourceMap": true,
"allowSyntheticDefaultImports": true,
"lib": [
"es2016",
"dom"
]
},
"exclude": [
"node_modules"
]
}
我的@types是通过npm安装的,位于node_modules目录中。
编译器能够找到@types,因为默认情况下typeRoots设置为node_modules / @ types。¹或者至少我认为正在发生这种情况。
问题
我们正在使用AngularJS,我们使用(愚蠢地,可能)由angular-mocks提供的module
变量来引导我们的spec文件。
但是,@ types / node也有一个module
,它有不同的类型。
现在每当我编译测试时,每个spec文件都会出错:Type 'NodeModule' has no compatible call signatures.
我希望避免将每个规范文件从module
更改为angular.mock.module
。我需要找到一种方法来排除@ types / node。
问题
在tsconfig中明确包含类型的最佳方法是什么?
可能的解决方案
选项A:列出typesRoots
属性下的必需类型,并将“node_modules”标记为exclude
。 (这会工作吗?)
选项B:根本不要使用typeRoots。使用include
和exclude
配置我想要的@types。 (这有效)
选项C:创建专用的tsconfig进行测试,并在专用的tsconfig中使用选项A或选项B(可能使用extends)
默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的
node_modules/@types
中的包都被视为可见;具体而言,这意味着./node_modules/@types/
,../node_modules/@types/
,../../node_modules/@types/
内的包等。
答案 0 :(得分:2)
最佳解决方案是使用types
tsconfig属性:
"types": ["angular", "angular-mocks", ... etc
这将阻止tsc自动枚举node_modules/@types
下您拥有的所有文件夹。如果需要,您可以使用配置文件继承,以便您可以共享所有其他编译器设置而无需重复。