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

TypeScript泛型进阶:通过TEvents约束TMethods实现WebSocket类型安全

问题:WebSocket类泛型关联与合并订阅操作的实现

我正在实现一个基于JSON-RPC与后端通信的WebSocket功能,目前已有一个WebSocket类对外暴露subscribe方法和post方法。其中post方法用于向后端发送调用请求,包括订阅后端事件(需调用post方法,指定method为Subscribe,params传入{topic: 事件主题})。

为保证类型安全,该类使用两个泛型:class WS<TEvents, TMethods>,其中TEvents用于定义前端可订阅的事件,TMethods定义可发送给后端的已知方法(后端必然支持Subscribe/Unsubscribe方法)。

当前存在的问题

用户订阅事件时需同时调用subscribe和post两个方法,示例代码如下:

// 给定如下类型:
type TEvent = {
    "my-topic": InterfaceOfTheTopic
    "another-topic": InterfaceOfTheOtherTopic
}

type TMethod = {
    Subscribe: (params: {topic: "my-topic" | "another-topic"}) => void;
}

const ws = new Socket<TEvent, TMethod>()

ws.subscribe("my-topic", subScriptionHandler);
ws.post("Subscribe", {topic: "my-topic"});

理想实现方式

希望让WebSocket类将这两个操作合并为一步,例如在类中实现:

async subscribe(event: keyof TEvents, callback: (...args: any[]) => void) {
    await this.post("Subscribe", {topic: event})
    return super.subscribe(event, callback);
}

这需要实现类似如下的泛型关联:

type BaseMethods<EVENTS> = {
    Subscribe: (params: {topic: keyof EVENTS}) => void
}

class WS<TEvents, TMethods & BaseMethods<TEvents>>

但我始终无法实现这一点。我知道泛型本质是元数据,退一步讲,至少希望能指定后端必然支持Subscribe和Unsubscribe方法(topic类型设为string也可),但目前仍未成功。

请问是否可以将一个泛型作为另一个泛型的参数,或者将泛型与使用第一个泛型的基础类型进行混合?

内容的提问来源于stack exchange,提问作者s.Bergmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:30:42