我正在尝试在Typescript中开发简单的事件总线类,在那里可以发布事件并订阅它们。 在发布的主题和发布的数据接口之间进行绑定会很不错。我试图使用函数和类泛型来实现这一点,但是我的一些测试用例没有按预期工作(以我预期失败的行编译好的方式)。我还添加了以下示例:https://www.typescriptlang.org/docs/handbook/generics.html ,按预期工作。在现实世界的情况下,我计划将主题实例存储在单个地方。
interface BaseMessage { };
interface MyMessage extends BaseMessage {
a: number;
};
interface MyMessage2 extends BaseMessage {
b: string;
}
class Topic<A> {}
class MyTopic extends Topic<MyMessage> { };
class MyTopic2 extends Topic<MyMessage2> { };
class MyTopic3 extends Topic<MyMessage2> { }; // example of another topic using the same message interface
class EventBus {
publish<T extends BaseMessage> (topic: Topic<T>, data: T): void {}
subscribe<T extends BaseMessage>(topic: Topic<T>, callback: (arg?: T) => void): void { }
loggingIdentity<T>(arg: Array<T>): Array<T> {
return arg;
}
loggingIdentity2<T>(arg: Topic<T>): Topic<T> {
return arg;
}
}
class Test {
init(): void {
let eb = new EventBus();
eb.loggingIdentity<MyMessage2>(new Array<MyMessage2>()); // works just fine
eb.loggingIdentity<MyMessage2>(new Array<MyMessage>()); // error as expected
eb.loggingIdentity2<MyMessage2>(new Topic<MyMessage2>()); // works just fine
eb.loggingIdentity2<MyMessage2>(new Topic<MyMessage>()); // I am expecting this to fail, but this works
eb.publish<MyMessage2>(new MyTopic2(), { a: 1 }); // fails on not satisfying data parameter interface - expected
eb.publish<MyMessage2>(new MyTopic2(), { b: "hello" }); // works just fine
eb.publish<MyMessage2>(new MyTopic(), { b: "hello" }); // I am expecting this to fail, because of the first parameter, but it works
}
}
也许我错过了那里的东西。任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
下面:
class Topic<A> {}
班级Topic
不使用通用类型A
。因此,Topic<SomethingHere>
和Topic<SomethingElse>
是兼容的。
使用泛型类型A
,错误将按预期发生:
class Topic<A> { abc: A; }