在Typescript(使用rxjs)中生成通用MessageBus时出现类型错误
我正在尝试用Typescript制作一个通用的MessageBus。我想要一些从父MessageBusMessage类派生的消息类。然后我希望能够订阅此类消息,并返回此类消息。强大的通用类型 这就是我到目前为止所做的:在Typescript(使用rxjs)中生成通用MessageBus时出现类型错误,typescript,rxjs,Typescript,Rxjs,我正在尝试用Typescript制作一个通用的MessageBus。我想要一些从父MessageBusMessage类派生的消息类。然后我希望能够订阅此类消息,并返回此类消息。强大的通用类型 这就是我到目前为止所做的: import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; import 'rxjs/add/operator/filter'; export class Messa
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/filter';
export class MessageBusMessage {
}
export class TestMessage extends MessageBusMessage {
constructor(public readonly someValue: string) {
super();
}
}
export class MessageBus {
private subject: Subject<MessageBusMessage>;
constructor() {
this.subject = new Subject();
}
public publish(message: MessageBusMessage) {
this.subject.next(message);
}
public getMessagesOf<T extends MessageBusMessage>(messageType: T): Observable<T> {
return this.subject.filter( (message) => {
return (message.constructor as any).name === (messageType as any).name;
}) as any;
}
}
const messageBus = new MessageBus();
const subscription = messageBus.getMessagesOf(TestMessage).subscribe(
(message) => {
console.log('got test message', message.someValue);
}
)
messageBus.publish(new TestMessage('some test value'));
从'rxjs/Observable'导入{Observable};
从'rxjs/Subject'导入{Subject};
导入'rxjs/add/operator/filter';
导出类MessageBusMessage{
}
导出类TestMessage扩展MessageBusMessage{
构造函数(公共只读someValue:string){
超级();
}
}
导出类消息总线{
私人主体:主体;
构造函数(){
this.subject=新主题();
}
公共发布(消息:MessageBusMessage){
this.subject.next(消息);
}
public getMessagesOf(messageType:T):可观察{
返回此.subject.filter((消息)=>{
return(message.constructor为任意)。name==(messageType为任意)。name;
})如有的话;
}
}
const messageBus=new messageBus();
const subscription=messageBus.getMessagesOf(TestMessage.subscripte)(
(信息)=>{
log('got test message',message.someValue);
}
)
publish(newtestmessage('sometestvalue'));
问题出在消息订阅内部。消息的类型是构造函数类型,而不是实际的对象实例类型,因此我从Typescript编译器中得到一个类型检查错误:类型“typeof TestMessage”上不存在属性“someValue”。
所以我可以看出,对于getMessageOf的返回类型,Observable类型是如何错误的。但正确的类型是什么?如何获取对象实例类型?您需要声明
getMessagesOf
采用T
的构造函数,而不是T
的实例:
public getMessagesOf<T extends MessageBusMessage>(messageType: new (...args: any[]) => T): Observable<T>
public getMessagesOf(messageType:new(…args:any[])=>T):可观察
您需要声明getMessagesOf
采用T
的构造函数,而不是T
的实例:
public getMessagesOf<T extends MessageBusMessage>(messageType: new (...args: any[]) => T): Observable<T>
public getMessagesOf(messageType:new(…args:any[])=>T):可观察
是的。成功了。你真的帮了我很多。我已经花了好几个小时试着让它自己工作。是的。成功了。你真的帮了我很多。我花了好几个小时试着让它自己工作。