有关TypeScript中通用构造函数引用的问题

时间:2019-04-15 11:19:50

标签: typescript generics

请考虑以下代码:

abstract class AbstractBusEvent { }

interface EventBusListener<T extends AbstractBusEvent> {
    (event: T): void;
}

class EventBus {
    public register<T extends AbstractBusEvent>(eventConstructor: { new (...args: any[]): T }, 
        listener: EventBusListener<T>): void {
    }
}

现在

class TempEvent extends AbstractBusEvent {}
class MyEvent extends AbstractBusEvent {}

const bus: EventBus = new EventBus();
bus.register(TempEvent, (e: MyEvent)=>{});//LINE X

问题是在LINE X-尽管您看到的是错误的,但我没有收到任何错误。我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

您的TempEventMyEvent是相同的。没有任何区别。因此,没有类型差异是正确的,因此可以在register方法中将两者混合使用。但是,如果您添加成员字段,则tscompiler将抱怨例如

class TempEvent extends AbstractBusEvent {
    props: string;
}
class MyEvent extends AbstractBusEvent {
    props: number;
}