Typescript中的"any"

7

我是TypeScript的初学者。我对"any"类型的使用存在疑惑。

如果我没错的话,使用"any"基本上是选择退出类型检查。例如:

  1. var num:any = 12

  2. var num = 12

我们可能可以直接使用第二种方法,那么使用"any"有什么必要呢?


你特别指出它是“任何类型”..否则就默认为它是“任何类型”..如果你要重构代码,并且想要明确标记这个处理任何类型,那么它会变得更加方便。它肯定有它的用途。 - Keith
1
JavaScript 是有效的 TypeScript。第二个是 JavaScript。你可以使用它,但 any 的明确性也很好。它让你知道开发者做出了明智的决定,允许这个变量是动态的。 - Marie
1
你几乎不会使用 any 来表示数字类型。 - baao
1
@bambam - 哇,你说得完全正确。谢谢你的交流 - 我每天都在这里学到新东西! - random_user_name
@cale_b 是的,我也是... 我实际上发现使用Java 10可以允许这种类型的声明,而且我想知道为什么一种“松散”类型的语言在这里应该更加严格... - baao
显示剩余5条评论
5个回答

12

虽然这两者在使用上是等效的(因为未指定类型时any是默认类型),但通过显式指定类型为any,您可以明确声明意图。

如果可用,Intellisense将显示类型为any,从而更容易理解变量的预期用途。


1
“...因为未指定类型时,任何类型都是默认类型...”这是不正确的,因为在问题中有一个初始化器。当有一个初始化器时,变量的类型是从初始化表达式的结果类型中推断出来的。在OP的例子中,类型是number证明 - T.J. Crowder

9
首先 - 如果我们谈论Typescript,请避免使用var关键字。
我们在编写应用程序时可能需要描述我们不知道的变量的类型。这些值可能来自于动态内容,例如来自用户或第三方库。在这些情况下,我们希望选择退出类型检查并让值通过编译时检查。为此,我们将这些标记为任意类型:
举个例子:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

更多信息: TypeScript中的类型


2
使用 "any" 基本上是选择退出类型检查,如果我没记错的话。

没错。

For example

var num:any = 12

var num = 12

we could probably use the second one itself...

当您不提供类型注释但提供初始化程序(= 12)时,TypeScript将根据初始化表达式的结果类型推断变量的类型。例如,在您的示例中,它将推断numberPlayground example

如果您想要能够稍后将num设置为其他内容(例如字符串),则可以使用any,如下所示 - 但请继续阅读,我不会这样做(playground):

let num: any = 12;
console.log(num);
num = "twelve";
console.log(num);

如果您没有注释类型 (: any),这将导致错误,因为 num 的类型被推断为 number (playground):

let num = 12;
console.log(num);
num = "twelve";
//^−−−− Type 'string' is not assignable to type 'number'.(2322)
console.log(num);

话虽如此,由于 any 选择了退出类型检查,因此尽可能避免使用它。在该示例中,如果我有一个非常好的理由允许变量是数字或字符串,最好给它一个联合类型 string | number(并且很可能要更改它的名称; playground):
let x: string | number = 12;
console.log(x);
x = "twelve";
console.log(x);

这样,如果我尝试分配一个boolean(例如),我会得到一个错误。

'any'的需求是什么?

any的目的,正如你所说,是为了在该变量上选择退出类型检查。这是the any documentation中的解释:

当你不想写出一个长长的类型来说服TypeScript某一行代码是可以的时,any类型非常有用。

但由于TypeScript的整个目标是提供静态类型检查,而any则选择退出了静态类型检查,因此通常情况下最好避免使用any。虽然并不总是可能(特别是在与项目范围之外的无类型代码进行接口交互时),但在可能的情况下,通常是最好的选择。


1

任意类型:当无法确定类型时使用。当您将类型声明为任意类型时,可以在该变量中重新分配任何类型的值。

var num:any = 12;
num = boolean;
num = "abcd"

-2

any 可以像你说的那样退出类型检查。你提出的第二个描述(没有 any)也能编译通过。但是,如果你使用类似 tslint 的 linting 工具,它就是无效(*)的。

(*) 通过“无效”我指的是你所使用的 IDE 将弹出一个警告。但归根结底; any valid Javascript code is also valid for Typescript,因为它们可以编译通过。


1
但是当您使用Linting时,它就无效了。那只是设置的问题。 - baao
1
如果在tslint.json中设置正确,你的IDE就不会抱怨了。如果还是有问题,那就换一个IDE吧.. :-) - baao

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