当前位置: 首页 > 知识库问答 >
问题:

节点。带有TypeScript的js:调用节点。js函数而非标准

邵阳德
2023-03-14

请帮我解决以下问题。我创建了默认节点。使用Visual Studio nodejs工具和express的js应用程序,现在我尝试调用在node中声明的setTimeout函数。d、 ts.代码如下:

var timer: NodeTimer;
timer = setTimeout(somecallback, 1000);

但是代码没有编译,表示无法将“Number”转换为“NodeTimer”

据我所知,问题是它需要标准的setTimeout函数,而不是从节点获取函数。d、 ts。

我尝试指定对节点的引用。d、 带<代码>\\\

共有3个答案

滕成双
2023-03-14

如果您遇到超时问题,例如无法将“Number”转换为“NodeTimer”或无法将“Number”转换为“NodeJS”。计时器“”或“”无法将“Number”转换为“NodeJS”。超时“”或类型“Timeout”不可分配给类型“number”当尝试在窗口和节点中使用它时,您可以对窗口和节点使用这种类型安全解决方案:

const timer: ReturnType<typeof setTimeout> = setTimeout(() => null, 1000);
clearTimeout(timer);
晋骏喆
2023-03-14

最简单的强制修复:

var timer: NodeTimer;
timer = <any>setTimeout(somecallback, 1000);

只是为了好玩

我根据当前节点定义(https://github.com/borisyankov/DefinitelyTyped/blob/master/node/node.d.ts#L22)创建了一个小样本,它在打字稿游乐场中运行良好

interface NodeTimer{
    ref() : void;
    unref() : void;
}
declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeTimer;

var timer: NodeTimer;
timer = setTimeout(()=>{}, 1000);

我不知道为什么你会有冲突,而我没有。仅供参考,冲突的setTimeoutlib.d.ts中定义,但这也包含在TypeScript游乐场中,不会引起任何戏剧性事件。

桓风史
2023-03-14

我怀疑这是由TS 0.9.5中引入的更改打破的,该更改在更改日志中描述为:

过载解决规则简化

描述:过载解析现在遵循一种更简单的算法。当多个重载适合一个给定的调用时,我们选择第一个合适的,而不是试图找到“最佳匹配”。

这意味着带有重载的代码现在应该手动从最紧密/更具体的重载排序到最松散。

可用的两种重载如下:

// in lib.d.ts
declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;

// in node.d.ts
declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeTimer;

显然,第一个重载总是与第二个重载可以匹配的所有内容相匹配,因此只要它是第一个重载,就始终是首选重载。

在有两个的情况下。d、 正如这里所示,文件的顺序定义了它们重载的相对顺序。通常情况下,lib。d、 ts总是第一位的,所以它得到了优先权。但是,如果手动引用它,请确保引用位于节点之后。d、 然后后者将优先,您将得到正确的重载。

从命令行执行此操作很容易-只需指定。d、 ts文件以所需的顺序显式显示。对于VS项目,您可以对_引用执行相同的操作。ts,像这样:

/// <reference path="Scripts/typings/node/node.d.ts" />
/// <reference path="C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\lib.d.ts" />

为了避免像这样硬编码绝对路径,您可能希望在脚本/类型/节点中制作项目中lib.d.ts的本地副本,以及node.d.ts.

您可能还想加入TypeScript论坛上关于此更改的讨论线程,并与TS团队分享您的经验。

 类似资料:
  • 我必须连接AWS中的redis群集。任何人都可以指导如何使用ioredis和node js连接到redis集群吗。将有一个主人和三个奴隶。提前感谢。

  • 我是 D3 的新手。因此,我正在尝试呈现一个图形,其中两个或多个孩子可以具有相同的父级。我想知道如何使链接再次定向到同一节点?我有断开的链接.. 任何帮助都是巨大的。 这是我的代码...

  • 我有一个Vuejs应用程序,我试图添加谷歌认证。我使用这个插件https://www.npmjs.com/package/vue-google-oauth2在前端生成授权代码,然后将其发送到我的后端,以便它可以获得用户凭据。 以下是前端的代码: 在此之前,我成功地获取了授权代码,并将其发送到使用node编写的后端。js基于官方谷歌文档。https://github.com/googleapis/g

  • 问题内容: 以下代码使我在节点js中出现异常:“需要删除或更新” 由于我指定了更新操作,因此无法解决问题。 问题答案: 节点驱动程序中的语法与外壳程序中的语法不同,这是您使用的语法。 有一个单独的功能

  • 我有两个表有下面的模式,我想从用户表中获取用户名和密码,从信息表中获取全名。 var infoSchema=mongoose.Schema({khatam_id:String,user_id:String,fullname:String,}); var usersSchema=mongoose.Schema({user\u id:String,username:String,password:St

  • 我试图在文件如下示例:如何为Firebase构建云函数,以便从多个文件部署多个函数?。 特别是,我有一个: 现在在index.ts我可以导入并附加一个用户身份验证侦听器,以便在创建新用户时触发,即: 然而,据我所知,只有实际上按预期工作,并且导出。userEvents似乎不会在创建新用户时触发。 ===================================================