请考虑以下代码:
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-尽管您看到的是错误的,但我没有收到任何错误。我的错误在哪里?
答案 0 :(得分:1)
您的TempEvent
和MyEvent
是相同的。没有任何区别。因此,没有类型差异是正确的,因此可以在register
方法中将两者混合使用。但是,如果您添加成员字段,则tscompiler将抱怨例如
class TempEvent extends AbstractBusEvent {
props: string;
}
class MyEvent extends AbstractBusEvent {
props: number;
}