function test(parm : number) {
console.log(parm);
}
var x = '12';
test(x); //does not compile as expected.
test(<any>x); //no error or warning.
为什么我在最后一行没有收到编译器错误?对文档的任何引用都会有所帮助。类型检查似乎被破坏
TIA
function test(parm : number) {
console.log(parm);
}
var x = '12';
test(x); //does not compile as expected.
test(<any>x); //no error or warning.
为什么我在最后一行没有收到编译器错误?对文档的任何引用都会有所帮助。类型检查似乎被破坏
TIA
随着<any>x
你在做什么是铸造变量x
键入any
。也就是说,你告诉编译器“嘿,在这个地方,我知道x
是真的是类型any
!”。编译器假定你是对的,并使用你为该调用给出的新类型。
any
是TypeScript中的一种特殊类型 - 它意味着该类型可以是任何东西,甚至可以改变类型!由于这个原因,编译器允许使用类型为any
的变量来代替任何其他类型。所以,虽然你的函数只接受number
类型的参数,但它也会接受类型为any
的参数,因为当然,这个any
确实可能是一个数字。
此行为示于language specification在第3.8.4节 - 分配兼容性(44-45页):
类型需要是分配在特定 情况下,如表达相容并赋值 语句中的变量类型以及函数调用中的参数和参数类型。小号 被分配给一个类型T,T是可分配的选自S,如果继 之一为真...:
- S和T是相同的类型。
- S或T是任何类型。
- ...
(重点煤矿)
如果我对这样的数字进行了类型转换x,我会预期不会出现错误:
@MBeckius就像我说的那样,这是一个特例。我不认为它是作为面向对象的超类来严格实现的(因为它当然不像一个!)。 *任何*几乎都会关闭整个变量的类型检查,它会接受任何赋值并被接受到任何方法中。 –
@MBeckius这很有用,因为默认情况下,所有的东西都被赋予了'any'类型(除非类型推断或注释指定了否则,或者它是原语)。这意味着默认情况下没有任何类型选中,您可以在TypeScript文件中使用JavaScript代码而无需转换。您还可以选择不使用智能/疯狂代码进行类型检查。 –
如果您将“any”读回自己,这会有所帮助:“此变量将满足* any * type”,或者在您的特定情况下“* x *将满足* any * type”。 – Fenton