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()
之类的东西是有意义的。不过,变通办法可以完成工作。