Javascript 为什么我们需要打字脚本中的任何类型?
我开始学打字了。 我想知道为什么我们需要Javascript 为什么我们需要打字脚本中的任何类型?,javascript,typescript,Javascript,Typescript,我开始学打字了。 我想知道为什么我们需要any类型如果每个变量都是一种“any”,我假设如果不指定类型 例如,对于x和y的任何值,这些代码输出都将始终为“是”: var x = "d"; var y: any = 5 ; alert(y); y = x ; alert(y); if (x===y) alert("yes"); else alert("no"); 如果每个变量都是一种“any”,我假设您不指定类型 这是正确的,但是如果您使用标志--noImplicitAny运行Type
any
类型如果每个变量都是一种“any”,我假设如果不指定类型
例如,对于x和y的任何值,这些代码输出都将始终为“是”:
var x = "d";
var y: any = 5 ;
alert(y);
y = x ;
alert(y);
if (x===y)
alert("yes");
else
alert("no");
如果每个变量都是一种“any”,我假设您不指定类型
这是正确的,但是如果您使用标志--noImplicitAny
运行TypeScript,那么TypeScript将不再假设变量在大多数情况下应该具有类型any
,例如
function foo(x) {
// x is of type any
}
上述操作将在--noImplicitAny
模式下生成错误。因此,如果在这种特定情况下,您希望x
成为any
,则必须明确请求:
function foo(x: any) {
// x is of type any
}
any
类型是一个转义图案填充,它允许您有效地关闭Typescript的类型检查。有时候,没有一个好的方法告诉Typescript你在做什么,所以你用any
来解决这个问题
并且类型不一定是任何类型。在许多情况下,当您取消类型注释时,Typescript将推断出一个类型,然后强制执行该类型<代码>设x=2将推断x
具有类型number
-并使用x=“cat”代码>稍后将创建一个错误。在这种情况下,如果需要,必须使用any
在其他情况下,您必须显式地使用any
,而不能仅“省略”,例如,对于泛型类型:
type Pair<A, B> = [A, B];
declare function needsSomethingPairedWithString(value: Pair<any, string>): void;
类型对=[A,B];
声明函数needsMethingPairedWithString(值:Pair):void;
对于这个需要methingpairedwithstring
函数,我们不关心该对的第一个元素是什么,也许我们会测试它的类型,也许我们甚至不会使用它,不管怎样,但关键是我们不关心。但是我们想指定对的第二个元素是字符串。因此,我们需要编写Pair
来表示这一点
在许多情况下,最好使用unknown
到any
来实现这些目的-unknown
的含义比any
更接近“不知道也不在乎”。但是,特别是在处理约束时,any
可以是正确的类型
最后,请注意--noImplicitAny
编译器标志的存在:这将导致任何类型的被推断为错误的情况。这迫使您要么修复问题以便正确推断,要么注释正确的类型,或者至少显式注释any
类型。对于从一开始就使用Typescript隐式的项目,这是强烈建议的,任何
都应该保留给逐渐将Javascript转换为Typescript的项目,因为它是许多bug的潜在来源。使用--noImplicitAny
会强制您明确说明任何
,这意味着以后阅读它的任何开发人员都会立即意识到正在使用任何
。这一点很重要,因为any
意味着事情不会像您希望的那样安全。请参阅。any
类型允许您选择不进行类型检查,以检查代码中无法轻松实现类型安全的部分。如果有的话,最好少用。我几乎可以肯定,对于这个问题,有一个规范的堆栈溢出问题/答案;搜索…尝试将其更改为x=y代码>编译器应该警告您,您正在尝试将数字分配给字符串(或某个字符串)。“如果每个变量都是某种“any”-您已经回答了自己的问题any
正是我们需要的变量类型,如果它需要保存任何值。“例如,对于x和y的任何值,这些代码输出都将始终是yes”是的,因为它们具有相同的值。你为什么不期望他们平等呢?作为记录,当您的代码被传输到JavaScript时,所有类型信息都会丢失——它不知道“any”是什么。类型信息只是为了让您作为开发人员更方便。“对于x和y的任何值,这些代码输出都是肯定的”-除了NaN
:-PI在评论中提到了类似的内容,不确定这是否是OP所问的。但OP似乎确实误解了推断的类型,而理解——不夸张可能有助于他们澄清。