【问题标题】:Can't seem to pass function to setTimeout argument array in node.js (TypeScript)似乎无法将函数传递给 node.js 中的 setTimeout 参数数组(TypeScript)
【发布时间】:2017-01-13 00:19:56
【问题描述】:

这行得通:

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 is not a function”。为什么?

function test(){
   console.log("Hi!");
}

function callTest(next: () => void){
   next();
}

setTimeout(callTest, 1000, [test]);

在我看来,它确实像一个函数!如果第一个代码 sn-p 有效,则表明我具有使用 setTimeout 并将参数发送到回调的通常正确的形式,而第二个代码 sn-p 表明这是调用作为参数传入的函数的正确形式- 为什么我在第三个代码 sn-p 中使用 setTimeout 不起作用?

【问题讨论】:

    标签: javascript node.js typescript settimeout


    【解决方案1】:

    你只需要在你传递给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 关闭。

    【讨论】:

    • 啊 - 所以你不传递参数数组,你只是继续列出它们?就像 callTest 采用 2 个参数一样:setTimeout(callTest, 1000, param1, param2)?为什么我在第一个示例中没有收到 TypeError,在该示例中我将数组作为参数传递给它期望一个字符串? (您完全正确,我将其标记为正确答案,但我只是想完全理解它。)
    • 您在评论中显示的setTimeout 是正确的。你的第一个例子有一个错误。在callTest 函数中,您直接调用test() 而不是调用next()
    • 这只是一个发布错误 - 我在问题中修复了它。您的回答为我做了(只是等待时间过去以标记为完成)。我很好奇为什么在第一个代码 sn-p 中它没有给出类型错误,但我猜 console.log 可以接受单个字符串的数组并且函数签名不会抛出 TypeError 所以有道理。
    • 是的,我关注的是错误的例子。我已经编辑了我的答案以解决前面的示例。如果解释需要澄清,请告诉我。
    • 非常有意义。我只想说我在阅读setTimeout(callback, delay[, ...args]) 的文档时犯了这个错误,但我把它读为setTimeout(callback, delay,[ ...args])。一个字符差异(我的错误),它让我掉进了这个兔子洞!
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多