2014-06-09 97 views
0
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

+2

如果您将“any”读回自己,这会有所帮助:“此变量将满足* any * type”,或者在您的特定情况下“* x *将满足* any * type”。 – Fenton

回答

2

随着<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是任何类型。
  • ...

(重点煤矿)

+0

如果我对这样的数字进行了类型转换x,我会预期不会出现错误: x。但在这种情况下,我对类似c#的语言进行类型转换会导致错误。 – MBeckius

+0

@MBeckius就像我说的那样,这是一个特例。我不认为它是作为面向对象的超类来严格实现的(因为它当然不像一个!)。 *任何*几乎都会关闭整个变量的类型检查,它会接受任何赋值并被接受到任何方法中。 –

+1

@MBeckius这很有用,因为默认情况下,所有的东西都被赋予了'any'类型(除非类型推断或注释指定了否则,或者它是原语)。这意味着默认情况下没有任何类型选中,您可以在TypeScript文件中使用JavaScript代码而无需转换。您还可以选择不使用智能/疯狂代码进行类型检查。 –

2

确定。直接从specs(第23页):

在打字稿所有类型都称为 Any型的单一顶级型的亚型。

所以你在的地方类型你使用它的anynumeric的。没有冲突。

+0

以我在静态类型语言中的经验,当期望子类型时传入超类型是无效的。 – MBeckius

+0

@MBeckius我相信这是多态行为的本质,​​这是OO语言的三个特征之一。你传递的是同一个物理对象 - 你只是以不同的方式声明它。 –