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