在tsconfig中明确包含类型的最佳方法是什么?

时间:2017-08-29 20:06:50

标签: angularjs typescript

我遇到过想要在node_modules目录中包含部分但不是全部@types的情况。

背景

我的tsconfig.json看起来像这样:

{
    "compilerOptions": {
        "module": "system",
        "target": "es5",
        "sourceMap": true,
        "allowSyntheticDefaultImports": true,
        "lib": [
            "es2016",
            "dom"
        ]
    },
    "exclude": [
        "node_modules"
    ]
}

我的@types是通过npm安装的,位于node_modules目录中。

enter image description here

编译器能够找到@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。使用includeexclude配置我想要的@types。 (这有效)

选项C:创建专用的tsconfig进行测试,并在专用的tsconfig中使用选项A或选项B(可能使用extends)

¹typescript docs说:

  

默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的node_modules/@types中的包都被视为可见;具体而言,这意味着./node_modules/@types/../node_modules/@types/../../node_modules/@types/内的包等。

1 个答案:

答案 0 :(得分:2)

最佳解决方案是使用types tsconfig属性:

"types": ["angular", "angular-mocks", ... etc

这将阻止tsc自动枚举node_modules/@types下您拥有的所有文件夹。如果需要,您可以使用配置文件继承,以便您可以共享所有其他编译器设置而无需重复。