为何代码中Publisher类使用<T extends Event>而非直接Event?
<T extends Event>而非直接Event 实现强类型校验,避免数据错误
如果直接用Event,publish方法的data参数是any类型,subject也只是宽泛的Subjects枚举值,编译时没法检查你传的数据和当前事件是否匹配。用泛型<T extends Event>后,每个子类可以定义自己专属的Event类型,比如:// 定义具体的事件类型 interface TicketCreatedEvent { subject: Subjects.TicketCreated; data: { id: string; title: string; price: number; }; } // 继承泛型Publisher class TicketCreatedPublisher extends Publisher<TicketCreatedEvent> { subject = Subjects.TicketCreated; }这时调用
publish时,必须传入符合TicketCreatedEvent['data']结构的参数,编辑器会自动提示,编译时也会拦截不符合的数据,彻底避免传错数据的问题。绑定subject与data的对应关系
泛型能把事件的subject和data类型强绑定在一起。比如TicketCreatedEvent的subject固定是'ticket:created',它的data也必须是对应的创建数据结构,不会出现用了'ticket:updated'的subject却传了创建数据的情况。如果直接用Event,subject和data是完全独立的,没法做这种关联校验。复用抽象逻辑的同时保留子类个性化
Publisher是抽象类,核心逻辑是封装NATS的publish调用。用泛型的话,所有事件发布子类都能复用这套逻辑,同时每个子类又能拥有自己的类型约束。要是不用泛型,要么所有子类都只能用宽泛的Event类型(丢了类型安全),要么每个子类都得重写publish方法来指定data类型,完全没必要重复造轮子。摆脱any类型的不确定性
原Event接口里的data是any,但通过泛型,子类可以把data定义成具体的结构,彻底告别any带来的不可预测性。写代码时编辑器能给出准确的属性提示,调试也更省心。
内容的提问来源于stack exchange,提问作者GoodMan

