【问题标题】:WebSocket interface cannot be used in place of WebSocket?WebSocket接口不能代替WebSocket吗?
【发布时间】:2021-09-28 00:22:00
【问题描述】:

我正在按照指南尝试使用 ws 和 Express 4 以及 NodeJS 和 TypeScript 来设置 WebSocket.Server。问题是我正在关注的指南(在这里找到:https://morioh.com/p/3b302785a62f)似乎已经过时了,或者因为提供的代码不起作用。

我正在尝试使用扩展的 websocket 对象来跟踪活动连接。它看起来像这样:

interface ExtWebSocket extends WebSocket {
    isAlive: boolean;
}

现在这样做,如教程中的代码所示,我收到一个错误:

setInterval(() => {
    wss.clients.forEach((ws: ExtWebSocket) => {
        if (!ws.isAlive) return ws.terminate();
        ws.isAlive = false;
        ws.ping(null, false, true);
    });
}, 10000);

错误指出我无法在forEach 循环中使用 ExtWebSocket 但我不知道为什么?

【问题讨论】:

  • 可能是因为根据类型定义 wss.clients 包含 WebSocket 对象,而不是 ExtWebSocket 对象,因此 TypeScript 不会让您尝试在已声明的内容上使用 ExtWebSocket 属性/方法作为WebSocket 对象。
  • 我只是不明白我链接的帖子是如何做到的(它在页面底部)。

标签: node.js typescript websocket


【解决方案1】:

这是因为您不能将 WebSocket 'de-narrow' 为 ExtWebSocket,因为它扩展了 WebSocket。如果您有 ExtWebSocket,那么您可以将其缩小为 WebSocket,但反之则不行。

这里是关于这个主题的打字稿手册的链接:https://www.typescriptlang.org/docs/handbook/2/narrowing.html

【讨论】:

  • 我是 typescript 的新手,所以我可能需要对它进行更多解释。 ExtWebSocket 扩展了 WebSocket,所以 ExtWebSocket is 是 WebSocket 对吗?还是 TS 使用这个概念的方式不同?
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多