这有效:
function test(msg:string){
console.log(msg);
}
setTimeout(test, 1000, ["Hi!"];
...因为它会打印出来#34;嗨!"一秒后到控制台。
这也有效:
function test(){
console.log("Hi!");
}
function callTest(next: () => void){
next();
}
callTest(test);
因为它还会打印出来"嗨!"到控制台。
以下结果导致错误" TypeError:next不是函数"。为什么呢?
function test(){
console.log("Hi!");
}
function callTest(next: () => void){
next();
}
setTimeout(callTest, 1000, [test]);
对我来说,它确实看起来像一个功能!如果第一个代码片段工作,它表明我有一般表格使用setTimeout并将参数发送到回调,第二个代码片段显示这是调用作为参数传入的函数的正确形式 - 为什么isn&# 39;我在第3段代码片段中使用setTimeout吗?
答案 0 :(得分:3)
您只需要在传递给setTimeout
的参数的末尾直接传递参数列表:
setTimeout(callTest, 1000, test);
如果你有更多的参数,你可以这样做:
setTimeout(callTest, 1000, test, a, b, c);
如果你打电话给Function.prototype.apply
,就没有必要把它们放在一个数组中。您收到错误的原因是您执行此操作的方式setTimeout
会传递一个长度为1的数组,其中包含对test
函数的引用。
你之前的字符串示例的原因是console.log
绝对可以将数组转储到控制台。并且TypeScript没有机会解决它的问题,因为当有一个参数列表传递给将被调用的函数时,这是definition of setTimeout
:
declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
如您所见,使用any
关闭了类型检查。