You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何代码中Publisher类使用<T extends Event>而非直接Event?

为什么Publisher类使用<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:10:31