在Typescript(使用rxjs)中生成通用MessageBus时出现类型错误

在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

我正在尝试用Typescript制作一个通用的MessageBus。我想要一些从父MessageBusMessage类派生的消息类。然后我希望能够订阅此类消息,并返回此类消息。强大的通用类型

这就是我到目前为止所做的:

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):可观察

是的。成功了。你真的帮了我很多。我已经花了好几个小时试着让它自己工作。是的。成功了。你真的帮了我很多。我花了好几个小时试着让它自己工作。