2015-07-18 36 views
1

下面的代碼編譯。Typescript使用函數參數應用+ concat

function myFunction(arg1:string, arg2:(msg:string)=>void){ /* do stuff */ } 
var args = ["hello", function(msg){ /* do stuff */ }]; 
myFunction.apply(myFunction, args); 

但下面的代碼不編譯,即使可變args是相同類型的如上。

function myFunction(arg1:string, arg2:(msg:string)=>void){ /* do stuff */ } 
var args = ["hello"].concat(function(msg){ /* do stuff */ }); 
myFunction.apply(myFunction, args); 

它會引發以下錯誤。

>> src/workspace.ts(20,29): error TS2345: Argument of type '(msg: any) => void' is not assignable to parameter of type 'string'. 

任何想法爲什麼?這是我的代碼中的錯誤還是TypeScript編譯器中的錯誤?

回答

2

在TypeScript中,當您創建數組時,將從數組成員中推斷出該類型。下面的代碼片段是一個Array<string>,或string[]

var a = ["hello"]; 

如果嘗試另一個值添加到這個陣列,它必須是一個字符串:

a.concat("A string"); 

如果你增加了一個功能,它會提醒你,這是不兼容:

a.concat(() => { return 5; }); 

,這也適用於你的榜樣,即使你馬上做,你可以通過添加允許的VA告訴攻略:

["hello"].concat("A string"); 

可以解決這個問題通過擴大陣列的類型:

var args = (<any[]>["hello"]).concat(function(msg){ /* do stuff */ }); 
+1

謝謝,這是有道理的。既然它返回一個新的數組,我不知道我是否同意TypeScript的'.concat()'的設計決定,要求它的參數與它所調用的數組的時間相同;對於像'.push()'這樣修改現有數組的東西是有意義的。解決方法雖然可以完成工作。 – sffc