基于 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');
有问题的两种类型...
- 调用时的泛型
webSocket<T>()
- 传递给下一个的值
.next<T>()
...它们是完全相同的类型。
您在实例化时定义的泛型 T
是订阅时将从网络套接字接收的消息类型。
WebSocketSubject
是 Subject
的扩展,其中包括像 .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$
时自动执行。
我正在使用来自 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');
有问题的两种类型...
- 调用时的泛型
webSocket<T>()
- 传递给下一个的值
.next<T>()
...它们是完全相同的类型。
您在实例化时定义的泛型 T
是订阅时将从网络套接字接收的消息类型。
WebSocketSubject
是 Subject
的扩展,其中包括像 .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$
时自动执行。