基于 request/response 的 rxjs WebSocketSubject 的不同类型(下一个消息类型,订阅消息类型),但只允许一个泛型

different types for rxjs WebSocketSubject based on request/response (next msg type, subscribe msg type), but only one generic is allowed

我正在使用来自 rxjs 的 webSocket,但泛型类型参数有问题。

websocket API 文档指出请求和响应消息具有不同的属性,但 WebSocketSubject 的通用只接受一种类型。

所以我们有类似的东西:

import { webSocket } from "rxjs/webSocket";

const subject = new webSocket<MessageType>('wss://something');

subject.subscribe({
    error: err => {
        throw err;
    },
    next: msg /* this is of type MessageType, but the actual object is not the same type as what is input into `subject.next` */ => {
        console.log(msg); // outputs something like: { anotherProperty: "anotherValue" }
    },
    complete: () => {
        done();
    }
}); 

// but this argument is also of type MessageType
subject.next({
    testProperty1: "test value 1"
});

那么问题是 next 属性 和 subscribe 方法中 msg 的类型和 subject.next 是相同的,而该文档为输入和输出消息指定了不同的类型(对象具有不同的属性)。

现在当然可以使用 any 或创建带有可选参数的联合类型以使事情正常进行,但是能够为输入消息指定一种类型会更理想另一个用于输出消息。这可以通过 webSocket 的 rxjs 实现轻松实现,还是我需要编写包装器或其他东西才能使它更干净?

理想情况下,我想做的事情会产生以下效果(当然,我目前看不出这是可能的):


const subject = new webSocket<RequestMessageType, ResponseMessageType>('wss://something');

有问题的两种类型...

  1. 调用时的泛型webSocket<T>()
  2. 传递给下一个的值.next<T>()

...它们是完全相同的类型。

您在实例化时定义的泛型 T 是订阅时将从网络套接字接收的消息类型。

WebSocketSubjectSubject 的扩展,其中包括像 .next() 这样的方法。这意味着 WebSocketSubject.next()Subject.next() 做同样的事情,它为所有 RxJS 订阅者发出类型 T 的下一个值。这就是为什么 .next() 方法具有相同的 T 泛型。

WebSocketSubject 允许您向 WS 发送消息(any 类型)的方式是当您声明将用于订阅者的 public 可观察对象时。

const wsSubject = webSocket<MessageType>('wss://something');

const wsMessages$ = wsSubject.multiplex(
  () => {} , // send message to WS server to start 
  () => {} , // send message to WS server to stop 
  (message) => true // filter messages by condition
);

这些开始和停止消息会在订阅者开始或结束订阅 wsMessages$ 时自动执行。

参考:https://rxjs.dev/api/webSocket/WebSocketSubject