当设置`noImplicitAny`时,Typescript忽略`typeRoots`

mar*_*seu 8 typescript

我通常设置我tsconfig.jsonstrict设置true.这意味着noImplicitAny也是如此true.但是,strict设置时,typescript似乎忽略typeRoots了本地创建*.d.ts文件的条目.这是tsconfig.json我使用的示例:

{
    "compilerOptions": {
        "declaration": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "lib": [ "es2017" ],
        "module": "CommonJS",
        "noImplicitReturns": true,
        "outDir": "lib",
        "removeComments": true,
        "sourceMap": true,
        "strict": true,
        "target": "es2017",
        "typeRoots": [ "./typings", "./node_modules/@types" ],
        "types": [ "node" ],
    },
    "compileOnSave": true,
    "include": [ "./src/**/*" ]
}
Run Code Online (Sandbox Code Playgroud)

我可以在tsconfig.json上面添加以下内容,它将起作用:

{
    "compilerOptions": {
        ...
        "noImplicitAny": false,
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我创建的示例项目,用于说明此问题:

https://github.com/marcoslin/tstyping-test

知道为什么会这样吗?

Tit*_*mir 7

noImplicitAny: false并没有真正解决问题,它只是忽略了它。template将被隐式键入,any因为找不到类型。你没有错误,但也没有类型安全。

真正的问题是您指定"types": [ "node" ],这意味着只有节点模块的类型是从typeRoots. 请参阅文档

最简单的解决方案是typestsconfig.json. 这个 tsconfig 没有给出任何错误:

{
    "compilerOptions": {
        "declaration": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "lib": [ "es2017" ],
        "module": "CommonJS",
        "noImplicitReturns": true,
        "outDir": "lib",
        "removeComments": true,
        "sourceMap": true,
        "strict": true,
        "target": "es2017",
        "typeRoots": [ "./typings", "./node_modules/@types" ]
    },
    "compileOnSave": true,
    "include": [ "./src/**/*" ]
}
Run Code Online (Sandbox Code Playgroud)