似乎无法将函数传递给node.js中的setTimeout参数数组(TypeScript)

时间:2017-01-13 00:19:56

标签: javascript node.js typescript settimeout

这有效:

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吗?

1 个答案:

答案 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关闭了类型检查。