Typescript 类型脚本应用+;带有函数参数的concat

Typescript 类型脚本应用+;带有函数参数的concat,typescript,Typescript,编译以下代码 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:

编译以下代码

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编译器中的错误?

在TypeScript中,创建数组时,将从数组成员推断类型。以下代码段是一个
数组
,或
字符串[]

var a = ["hello"];
如果尝试向该数组添加另一个值,则该值必须是字符串:

a.concat("A string");
如果您添加了一个函数,它会警告您该函数不兼容:

a.concat(() => { return 5; });
这也适用于您的示例,即使您正在立即执行此操作,您可以通过添加允许的值来判断:

["hello"].concat("A string");
您可以通过扩大阵列的类型来解决此问题:

var args = (<any[]>["hello"]).concat(function(msg){ /* do stuff */ });
var args=([“hello”]).concat(函数(msg){/*do stuff*/});

谢谢,这很有道理。由于它返回一个新数组,我不知道我是否同意TypeScript的设计决策,即
.concat()
要求其参数与调用它的数组的时间相同;这对于修改现有数组的
.push()
之类的东西是有意义的。不过,变通办法可以完成工作。