Typescript泛型函数不能按预期工作 - 包含另一个泛型类型的参数,编译好

时间:2016-04-26 08:21:58

标签: generics typescript

我正在尝试在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
    }
}

也许我错过了那里的东西。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

下面:

class Topic<A> {}

班级Topic不使用通用类型A。因此,Topic<SomethingHere>Topic<SomethingElse>是兼容的。

使用泛型类型A,错误将按预期发生:

class Topic<A> { abc: A; }