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
相关产品推荐
相关产品推荐

