【发布时间】:2020-08-04 22:36:14
【问题描述】:
我目前正在使用 typescript 在 React 上开发 Websocket 通信总线。目前,正在尝试重构此代码:
public onClientMessage(msg: IMessage) {
switch (msg.type) {
case "init": {
this.handleInit(msg);
break;
}
case "authorize": {
this.handleAuthorize(msg);
break;
}
case "render": {
this.handleRender(msg as IRenderMessage);
break;
}
default: {
console.warn("Unsupported type. Type: ", msg.type);
break;
}
}
}
这样可以抽象出来,其他类可以给这个方法增加新的消息类型和函数调用。 我正在研究依赖注入(或多或少http://inversify.io/)。但是,我觉得这对于一个简单的任务来说可能有点过头了。
你们还有什么可以推荐的吗?我也想过这样的事情:
private map = new Map<Message, (msg) => void>([
[Message.Init, this.handleInit(msg)],
[Message.Authorize, this. handleAuthorize(msg)],
[Message.Render, this. handleRender(msg)] ...
]);
onClientMessage(msgType: Message, msg: IMessage) {
if (this.map.has(msgType)) {
this.map.get(msgType)();
}
}
并且基本上附加到地图上。
有没有更好的解决方案?
【问题讨论】:
-
我一般不太熟悉 websockets,所以也许其他人可以提供更好的答案,但我认为你想多了。当简单的函数可以使用时,我并没有真正看到在此处使用依赖注入或类的意义。没有更多代码或澄清,我看不出这两个代码示例有什么问题。无论哪种方式,您都必须拥有某种类型的条件映射或键/值映射。
-
我同意@MartinDawson。所描述的用例让我想起了 Redux Thunk。您可能会从那里获得灵感。
-
是的,我就是这么想的。我可能想太多了。谢谢大家
-
我真的很喜欢 Map 方法。我做过类似的事情,效果非常好。
-
我会保留 switch 语句,但使用 string 和 typeof 作为 type 属性来键入您的消息,以便打字稿可以推断出 switch 语句中的消息类型(因此不再进行诸如“msg as IRenderMessage”)。您可以查看 redux 文档以获取完整示例:redux.js.org/recipes/…
标签: javascript reactjs typescript dependency-injection websocket