2014-06-09 129 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語言的三個特徵之一。你傳遞的是同一個物理對象 - 你只是以不同的方式聲明它。 –