2015-08-26 85 views
3

這是一個編譯得很好的TypeScript代碼片段(使用1.5.3)。TypeScript類型函數參數接受任何

function alertNumber(a: number) { 
    alert(a + 1); 
} 
var x:any = "string"; 
alertNumber(x); 

這怎麼可能是要求某種類型的參數的函數可以用any類型的參數來調用?

回答

4

這是因爲您在使用any類型時選擇不進行類型檢查。

[有時候]我們希望選擇退出類型檢查,並讓值通過編譯時檢查。爲此,我們將這些標記爲「任何」類型。 - Handbook

爲了避免麻煩與any

  1. 使用--noImplicitAny編譯器選項(或在Visual Studio關閉Allow implicit any types)。
  2. 不要使用顯式any類型除非必要,(例var x: any
+1

雖然現在我明白這是如何工作的,我還覺得奇怪。即使沒有'--noImplicitAny'選項,我也會推測當我向函數聲明中添加一個類型時,它會要求任何調用者傳遞該類型。 「any」的含義仍然應該是「這可以是任何東西」,但是你不應該只在需要特定類型的地方傳遞「anything」變量。 – LukasH

+0

@LukasH我看你已經用c#編程了。目前,'any'類似於c#中的一個動態變量(例如'dynamic str =「asdf」; int num = str;'可以)。所以就像你應該避免在c#中使用動態類型一樣,我會建議避免TypeScript中的任何類型。 –

+0

我理解你的觀點,但是當你將現有的JavaScript項目轉換爲打字稿時,很難避免任何'任何'。對於這種打開'--noImplicitAny'的工作流不是一種選擇,因爲它需要重寫整個代碼庫。我想要的任何一個對象都可以具有任何屬性,但是不能將其傳遞給請求某種類型的任何地方。 – LukasH