当设置了noNomplicitAny时,打字稿会忽略typeRoots

时间:2019-01-21 12:15:54

标签: typescript

我通常将tsconfig.json设置为strict来设置true。这意味着noImplicitAny也设置为true。但是,设置strict时,打字稿似乎忽略了我在本地创建的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/**/*" ]
}

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

{
    "compilerOptions": {
        ...
        "noImplicitAny": false,
        ...
    }
}

这是我创建的一个示例项目来说明此问题:

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

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

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

真正的问题是您指定了"types": [ "node" ],,这意味着仅从typeRoots中获取了节点模块的类型。参见docs

最简单的解决方案是从types中删除tsconfig.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/**/*" ]
}