Javascript Can';似乎没有将函数传递给node.js(TypeScript)中的setTimeout参数数组
这项工作:Javascript Can';似乎没有将函数传递给node.js(TypeScript)中的setTimeout参数数组,javascript,node.js,typescript,settimeout,Javascript,Node.js,Typescript,Settimeout,这项工作: function test(msg:string){ console.log(msg); } setTimeout(test, 1000, ["Hi!"]; …在一秒钟后,它将向控制台打印“嗨!” 这也适用于: function test(){ console.log("Hi!"); } function callTest(next: () => void){ next(); } callTest(test); 在这种情况下,它还会向控制台输出“嗨!
function test(msg:string){
console.log(msg);
}
setTimeout(test, 1000, ["Hi!"];
…在一秒钟后,它将向控制台打印“嗨!”
这也适用于:
function test(){
console.log("Hi!");
}
function callTest(next: () => void){
next();
}
callTest(test);
在这种情况下,它还会向控制台输出“嗨!”
以下结果导致错误“TypeError:next不是函数”。为什么?
对我来说,这确实是一个功能!如果第一个代码段正常工作,则表明我通常有权使用setTimeout并向回调发送参数,第二个代码段显示,这是调用作为参数传入的函数的正确形式-为什么我在第三个代码段中使用setTimeout不起作用?您只需要在传递给
setTimeout
的参数末尾直接传递参数列表:
setTimeout(callTest, 1000, test);
如果你有更多的争论,你会:
setTimeout(callTest, 1000, test, a, b, c);
没有必要像打电话一样将它们放入数组中。出现错误的原因是,执行此操作的方式setTimeout
传递了一个长度为1的数组,该数组包含对test
函数的引用
前面的字符串示例之所以有效,是因为console.log
完全可以将数组转储到控制台。TypeScript没有机会对此提出质疑,因为这是一个参数列表,当有参数传递给将被调用的函数时:
declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
正如您所见,类型检查通过使用
any
关闭,您只需在传递给setTimeout
的参数末尾直接传递参数列表:
setTimeout(callTest, 1000, test);
如果你有更多的争论,你会:
setTimeout(callTest, 1000, test, a, b, c);
没有必要像打电话一样将它们放入数组中。出现错误的原因是,执行此操作的方式setTimeout
传递了一个长度为1的数组,该数组包含对test
函数的引用
前面的字符串示例之所以有效,是因为console.log
完全可以将数组转储到控制台。TypeScript没有机会对此提出质疑,因为这是一个参数列表,当有参数传递给将被调用的函数时:
declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
正如您所看到的,类型检查是通过使用
any
Ah关闭的-所以您不传递参数数组,而是一直列出它们?就像callTest接受2个参数一样:setTimeout(callTest,1000,param1,param2)
?为什么在我的第一个示例中没有得到一个TypeError,在这个示例中,我传递了一个数组作为参数,而它需要一个字符串?(你完全正确,我会将此标记为正确答案,但我只想完全理解。)你在评论中显示的setTimeout
是正确的。您的第一个示例有一个错误。在callTest
函数中,您直接调用test()
,而不是调用next()
。这只是一个发布错误-我在问题中修复了它。你的回答为我做到了(只是等待时间过去标记为完成)。我很好奇为什么在第一个代码段中它没有给出类型错误,但我想console.log可以接受一个字符串数组,函数签名不会抛出类型错误,所以这是有意义的。是的,我关注的是错误的示例。我已经编辑了我的答案来解决前面的例子。如果解释需要澄清,请告诉我。非常合理。我只想说,我是在阅读说明setTimeout(callback,delay[,…args])
的文档时犯了这个错误的,但我将其理解为setTimeout(callback,delay,[…args])
。一个字符的差异(我的错误)和它送我下这个兔子洞!啊-所以你没有传递一个参数数组,你只是一直列出它们?就像callTest接受2个参数一样:setTimeout(callTest,1000,param1,param2)
?为什么在我的第一个示例中没有得到一个TypeError,在这个示例中,我传递了一个数组作为参数,而它需要一个字符串?(你完全正确,我会将此标记为正确答案,但我只想完全理解。)你在评论中显示的setTimeout
是正确的。您的第一个示例有一个错误。在callTest
函数中,您直接调用test()
,而不是调用next()
。这只是一个发布错误-我在问题中修复了它。你的回答为我做到了(只是等待时间过去标记为完成)。我很好奇为什么在第一个代码段中它没有给出类型错误,但我想console.log可以接受一个字符串数组,函数签名不会抛出类型错误,所以这是有意义的。是的,我关注的是错误的示例。我已经编辑了我的答案来解决前面的例子。如果解释需要澄清,请告诉我。非常合理。我只想说,我是在阅读说明setTimeout(callback,delay[,…args])
的文档时犯了这个错误的,但我将其理解为setTimeout(callback,delay,[…args])
。一个字符的差异(我的错误)和它送我下这个兔子洞!