Typescript: 对 "Any" 的严格检查

3

我的Typescript配置允许以下代码编译:

const thing : any = 123
const name : string = thing

显然,name并不是真正的string类型,但是我将其声明为any类型,使得我的类型检查器忽略了它。


我应该如何配置我的tsconfig.json文件以便在我没有提供正确的对象类型时报错呢?

我的当前配置:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noEmitOnError": true,
        "noImplicitAny": true,
        "noImplicitReturns": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "strictNullChecks": true,
        "moduleResolution": "node",
        "sourceMap": true,
        "outDir": "dist",
        "baseUrl": ".",
        "paths": {
            "*": [
                "node_modules/*",
                "src/types/*"
            ]
        }
    },
    "include": [
        "src/**/*.ts"

    ]
}

有一个配置选项 "--noImplicitAny",可能可以实现你想要的功能。看起来是可用的 tsconfig 选项中最接近的:https://www.typescriptlang.org/docs/handbook/compiler-options.html - oooyaya
我已经使用我的当前的tsconfig.json更新了问题。该设置已经启用。 - RyanNHG
如果我从函数的参数列表中删除 : Request,那么 noImplicitAny 将会抛出一个错误。 - RyanNHG
嗯,也许你不能这样做。你可以强制转换属性,如果它们的形状不匹配,则会出现错误。所以像 name: <应该是什么类型名>req.body.name 这样。如果你只关心其中一个部分的类型,你也可以像这样做:(<请求>req).body.name - oooyaya
3
@RyanNHG 你不会得到任何错误。这就是 any 的全部意义所在,它禁用了所有类型检查。 - Saravana
显示剩余2条评论
2个回答

3

但是,如果我将其声明为任意类型,类型检查器就会忽略它。

这是有意设计的。通过将其声明为 any 类型,您明确要求类型检查器忽略它,而这也是它所做的。


1

any类型是有意设计成禁用类型检查的。从TypeScript 3.0开始,另一种类型称为unknown,基本上是any的严格版本。

const thing: unknown = 123;
const name: string = thing; // <- error TS2322: Type 'unknown' is not assignable to type 'string'.

你可以在TypeScript 3.0的发布说明中找到更多相关信息。 目前 - 发布约两年后 - 这种类型尚未列为网站上的基本类型之一。然而,有一个新版网站的测试版,其中也列出了unknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接