📜  解释 TypeScript 中的 noImplicitAny

📅  最后修改于: 2022-05-13 01:56:19.517000             🧑  作者: Mango

解释 TypeScript 中的 noImplicitAny

TypeScript 是微软公司开发的一种面向对象的强类型编译语言。它是 javascript 的超集,这意味着每个可持续的 JavaScript 代码本质上都是有效的 TypeScript 代码(这意味着 JavaScript 是具有一些附加功能的 TypeScript)。 TypeScript 是基于 JavaScript 构建的。我们可以做的是编写 TypeScript 代码并使用 TypeScript Compiler 将其编译成 JavaScript。将有效的 JavaScript 代码库迁移到 TypeScript 并不难,因为语法正确的 JavaScript 代码只不过是 TypeScript 代码。

作为理解noImplicitAny的先决条件,我们需要了解 TypeScript 中的Any数据类型。

什么是任何类型?

当我们实际上不知道将返回给我们什么类型时,应该真正使用任何类型。例如,当我们使用任何返回任何没有类型定义的函数参数时,这甚至在用纯 JavaScript 编写时也适用。任何类型都是 TypeScript 中的一种特殊类型,我们可以在想要有效关闭 TypeScript 类型检查时使用它。我们经常需要这个,因为有时我们需要忽略 TypeScript 给出的类型错误。它就像 Typescript 中所有内置类型和用户定义类型的超集。

如果我们有一个 let 语句(一个 let 语句允许我们重新分配一个值,而一个 const 不允许)和变量标识符文本并且我们不向它添加类型:

let test;

这里 let test 在我们的 IDE 中转换为 let test: any,因此 TypeScript 实际上是在向我们推断类型而不是声明它。然而,即使我们为变量 test 分配了一个字符串,它确实是完全正确的,但我们的 IDE 仍然会将它显示为任何类型。因此,Typescript 不会更改任何类型的变量的数据类型,它被设置为默认值。

let test;
test = "GeeksForGeeks";

什么是 noImplicitAny?

noImplicitAny 是我们可以在 TypeScript 中修改的编译器配置或编译器选项。此配置的主要函数是通过使用它,我们可以将 typeScript 从可选类型语言转换为严格类型语言。如果我们不指定类型,并且 TypeScript 无法自动推断,编译器将默认为任何类型。在某些情况下,这可能是一个严重的问题,因为变量的任何类型都会告诉编译器“不要类型检查这个”。

noImplicitAny 编译器选项的存在将导致为类型推断任何类型的情况成为错误。这将迫使我们要么以可以正确推断类型的方式进行修复,要么至少将类型显式声明为任何类型。

例子:

HTML


 

    
        Here we haven't explicitly declared the variable.
        So a error will be returned.
    
        


HTML


 

    
        Here we have explicitly declared the variable.
        So no error will be returned.
    
        


当我们在编译器选项中配置noImplicitAny时,上面的代码将抛出错误,因为我们没有显式声明变量g

输出:

例子:

HTML



 

    
        Here we have explicitly declared the variable.
        So no error will be returned.
    
        

这里我们已经显式声明了变量g,所以不会返回错误。

输出:

如何使用 noImplicitAny?

为了使用noImplicitAny作为编译器选项,我们需要配置 compilerOptions tsconfig.json 中。我们需要将 noImplicitAny 设置为true。因此,通过将 noImplicitAny 设置为 true,我们将确保我们不会意外地让编译器通过推断任何类型而错过类型检查。这样做之后

{
  "compilerOptions": {
    "noImplicitAny": true
  }
}

还有另一种方法可以通过使用strict选项在编译器选项中启用 noImplicitAny。对于任何开发人员来说,使用noImplicitAny都是一种很好的做法,当从 JavaScript 迁移到 TypeScript 代码库时,没有人会想要到处添加数据类型。因此,在我们使用 noImplicitAny 之后,我们必须在第一次编写脚本时显式添加类型,以便以后不会变得痛苦。

{
  "compilerOptions": {
    "strict": true
  }
}