如何使用 Node.js 包中的 TypeScript 键入信息?

Posted

技术标签:

【中文标题】如何使用 Node.js 包中的 TypeScript 键入信息?【英文标题】:How do I use TypeScript typing information from a Node.js package? 【发布时间】:2022-01-13 21:56:58 【问题描述】:

我已经阅读了大量关于同一个问题的不同变体,但我无法完全理解它。我正在使用 websocket 模块(我以前在没有 TypeScript 的情况下使用过很多次),但我不知道如何键入我的变量?

我有一个接收 WebSocketConnection 对象的函数,但是当我给它类型 WebSocketConnection 时,我从 TypeScript 得到一个 "Cannot find name 'WebSocketConnection'"

我已经安装了@types/websocket 包,我可以看到index.d.ts 文件中的所有类型定义都位于./node_modules/@types/websocket/index.d.ts 中,相对于我的tsconfig.json 文件...

我尝试将"typeRoots" 选项添加到tsconfig.json 文件以及"types"。我尝试了许多值的组合,但据我所知,完全放弃它们是更好的选择,所以我也尝试过。我还尝试了来自.d.ts 文件和包本身的importing 数据的许多变体,当然没有运气。

我尝试使用/// <reference path="node_modules/@types/websocket/index.d.ts" /> 也没有运气。

我查看了.d.ts 文件,发现了一个名为IStringified 的接口的非常清晰的声明,如下所示:

export interface IStringified 
    toString: (...args: any[]) => string;

所以我尝试访问IStringified,但我仍然收到相同的"Cannot find name 'IStringified'" 错误。

我可能只是真的很愚蠢并且遗漏了一些显而易见的东西,但任何指针或建议将不胜感激!我到底做错了什么?

【问题讨论】:

【参考方案1】:

已安装包的类型在全球范围内不可用。必须将它们导入到每个文件中才能使用它们。不要乱用typeroots 或三斜杠指令,这只会让事情变得更糟。

在这种特殊情况下,the module exports a connection class,这可能是您想要的。不幸的名字意味着让它看起来像真正的类构造函数,你可能应该在导入时重命名:

import 
  server as WebSocketServer,
  connection as WebSocketConnection,
 from 'websocket'

现在你可以这样做了:

const wsServer = new WebSocketServer( httpServer: server );

wsServer.on('request', function(request) 
  var connection = request.accept('echo-protocol', request.origin);
  doSomethingWithWsConnection(connection) // works
);

function doSomethingWithWsConnection(connection: WebSocketConnection) 
  //...

Typesafe example on TS playground


所以我尝试访问 IStringified,但仍然收到相同的“找不到名称 'IStringified'”错误。

你导入类型,然后使用类型:

import  IStringified  from 'websocket'
const foo: IStringified =  toString: () => 'asdf' 

Playground

【讨论】:

为了扩展这一点,export IStringified from 'websockets' 在@AlexWayne 的游乐场示例中可以正常工作

以上是关于如何使用 Node.js 包中的 TypeScript 键入信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何将信息从 node.js 传递到 html

使用Node.js进行Web开发

如何使用node.js中的C ++库?

使用zip.js压缩文件和解压文件

如何将 Node.js 中的 net 模块与 browserify 一起使用?

让node.js及时发送数据报socket数据