2016-02-05 59 views
1

在下面的代碼片斷中,我已經聲明瞭一個IMath接口,並在add方法中實現,它的工作原理非常好。爲什麼在TypeScript的界面代碼下執行?

但是,在乘法中,它應該給出編譯錯誤,因爲我只傳遞一個參數,第二個參數不是可選的。

interface IMath { 
    (a: number, b: number): number; 
} 

// using the interface 
var add: IMath; 
add = function (a: number, b: number) { 
    return a + b; 
} 
var sum = add(5, 3); 
alert(sum); 


var multiply: IMath; 
multiply = function (c: number) { 
    return c; 
} 
var result = multiply(5, 3); 
alert(result); 

但我沒有在Visual Studio中出現任何編譯錯誤,有任何猜測?

回答

2

這是因爲(number) -> number類型的函數可以分配給(number, number) -> number類型。只是第二個參數被忽略並被拋棄,但這並不意味着你不能用兩個參數調用它,從而使賦值有效。

請參見下面的小例子,顯示一個有效的賦值:

var f: (a: number, b:number) => number = function (a:number):number { 
    return 0; 
} 
f(1, 2); 
+0

這也在說明http://www.typescriptlang.org/Handbook#type-compatibility-comparing-two-functions –

+0

好像我知道了。我想這與JavaScript的工作方式有關,即使帶有兩個參數的函數僅用一個參數調用,JavaScript也是最好的猜測,並且用第二個參數調用函數是未定義的。在C#等其他編程語言中也可能不可能。 –

+0

謝謝一噸戳,剛剛更新我的職位提到上述信息 - http://techfunda.com/howto/1071/interfaces-in-typescript –