2015-09-25 130 views
1

爲什麼在這段代碼中沒有任何編譯錯誤? 代碼:Typescript:爲什麼沒有參數的函數可以強制轉換爲參數

function partial(f: (a: string) => string, a: string) : string { 
    return ""; 
} 

var test =() => ""; 
var result = partial(test, ""); 

功能「部分」需要作爲第一個參數的函數,這需要一個參數,但我傳遞給它的功能,不帶任何參數,打字稿編譯器認爲,這是好。我明白這不能破壞任何東西,因爲你可以將世界中的所有參數傳遞給不需要的函數,它不會破壞任何東西,但它應該是編譯錯誤,因爲typescript是關於類型的,是一個明顯的類型錯配,它可能是一個開發人員的錯誤。

是否有解決此問題的任何解決方法?

+1

也許我錯過了一個術語步驟或什麼(我不是一個打字稿用戶),但不會有一個函數與參數和功能,但仍然都是功能?爲什麼會拋出一個類型錯誤?他們都是同一類型。 –

回答

2

有一個明顯的類型錯配,它可能是一個開發人員的錯誤。

這段代碼沒有什麼明顯的錯誤。考慮這樣的事情:

let items = [1, 2, 3]; 
// Print each item in the array 
items.forEach(item => console.log(item)); 

此編碼是否正確?非也!但forEach調用其提供的功能與三個參數,而不是一個。這將是乏味有寫:

items.forEach((item, unused1, unused2) => console.log(item)); 

請注意,如果你試圖做一些事情,實際上是錯誤的,你仍然可以得到錯誤。例如:

function printNumber(x: number) { console.log(x); } 
let strings = ['hello', 'world']; 
strings.forEach(printNumber); // Error, can't convert string to number 
+0

嗯,我不同意這一點。如果你有一個函數可能需要1個參數,有些重載可能需要2或3個參數,你應該爲所有原型創建類型。我認爲沒有區別。 對於你的例子,如果Array上的forEach方法可以作爲第一個arg函數,它需要一個參數,兩個參數或三個參數,你應該在類型中創建3個原型來顯示這三種可能性。 –

+1

這不會模擬任何函數的運行時行爲。 'forEach' *總是*用三個參數調用它的參數;它不會檢查回調的長度以決定使用多少個參數來調用它。 –

相關問題