如何使用 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
文件和包本身的import
ing 数据的许多变体,当然没有运气。
我尝试使用/// <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 键入信息?的主要内容,如果未能解决你的问题,请参考以下文章