【发布时间】:2017-07-20 09:33:10
【问题描述】:
我正在尝试在 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'));
问题出在消息订阅内部。消息的类型是构造函数类型,而不是实际的对象实例类型,所以我从 Typescript 编译器收到类型检查错误:Property 'someValue' does not exist on type 'typeof TestMessage'.
所以我可以看到 Observable 类型对于 getMessageOf 的返回类型是错误的。但正确的类型是什么?如何获取对象实例类型?
【问题讨论】:
标签: typescript rxjs