类型检查似乎被颠覆了

时间:2014-06-09 17:11:07

标签: typescript

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 个答案:

答案 0 :(得分:2)

使用<any>x您正在执行的操作是将变量x转换为any类型。也就是说,你告诉编译器&#34;嘿,在这个地方,我知道x 真的类型为any!&#34; 。编译器假定您正确并使用您为该呼叫提供的新类型。

any是TypeScript中的一种特殊类型 - 它意味着类型可以是任何类型,甚至可以更改类型!因此,编译器允许使用类型any的变量而不是任何其他类型的变量。因此,虽然您的函数只接受number类型的参数,但它也会接受any类型的参数,因为当然any可能是一个数字。

此行为显示在第3.8.4节中的language specification - 分配兼容性(第44-45页)中:

  

要求类型在某些情况下与赋值兼容   情况,例如赋值中的表达式和变量类型   语句以及函数调用中的参数和参数类型。小号   可分配给类型T,并且T可从S分配,如果其中之一   以下是真实的......:

     
      
  • S和T是相同的类型。
  •   
  • S或T是Any类型。
  •   
  • ...
  •   

(强调我的)

答案 1 :(得分:2)

行。直接来自specs(第23页):

  

TypeScript中的所有类型都是单个顶级类型的子类型,称为   Any类型。

因此,您已经使用超类型 numeric来代替类型 any。没有冲突。