在打字稿接口后面生成http客户端?可以吗?

问题描述 投票:0回答:2

我试图理解装饰器,它不是java的注释,而是更像预处理器在本文中,我还发现了这个关于在函数上设置信息的SO问题。 假设我有一个像这样的界面

export default interface UserService {

    @Path("/users/create")
    @POST
    createUser(user: CreateUserRequest): Promise<CreateUserResponse>;

    @Path("/users/delete")
    @POST
    deleteUser(user: DeleteUserRequest): Promise<DeleteUserResponse>;

}

旁注:在 React UI 中使用这个生成的客户端以及在 Nodejs 中使用会很棒

我希望我的@Path和@POST,@GET保存我可以阅读和我认为的信息

class Path(path:string):
    def __init__(self, path):
        self.path = path

    def __call__(self, func):
        func.pathAnnotation = self
        return func

我读到我无法循环接口中的方法,但我想生成实现此接口的 http 客户端,以便任何 API 开发人员创建时,它都会自动创建实现。 (在java中,我们使用Proxy.java来生成一个实现)。 在服务器端,控制器实现相同的 API,我喜欢生成“脚手架”,这意味着如果可能的话,要调用哪个端点的 http 请求(不确定我是否可以在 Nodejs 中做到这一点)。

编辑:一个想法:也许,我创建一个抽象类或类,并且每个方法都会抛出异常“使用 XXXFactory 生成此类的实现”。 如何循环该类中的方法? 我可以创建在运行时扩展所有这些“api”的类,以便我可以注入他供每个人使用(就像java世界中的Proxy.java)?

编辑:也许我可以在 javascript 中使用原型类以某种方式执行此操作...生成所有方法来调用带有签名的方法

Promise<Object> invoke(String method, object[] paramsToMethod);

然后,我可以查找该方法以及该方法上的 @Path 和 @GET/@POST 属性。 原型类是否可以扩展 javascript 中的类,以便该类实现任何定义的 api(可能在打字稿中定义)? 然后我让每个微服务的每个 api 都通过相同的代码实现,就像我们在 java 中所做的那样? (这意味着平台团队可以交换协议,开发人员不再关心 http、http2、二进制等协议)

javascript node.js reactjs typescript javascript-decorators
2个回答
1
投票

根据要求,我花了一些时间来修改反思。反射主要是为了让客户端自动符合服务所期望的(参数类型/返回类型),我认为这可能是可能的

reflect-metadata

好吧,我们的想法是让装饰器在映射中存储有关方法的元数据,其中键是类,值是带有元数据的方法的集合。

然后,在您获取客户端的地方,它将每个方法的所有元数据聚合到一个可以使用的函数中。

这是一个模糊的开始,但我认为它可以发挥作用。如果我有时间的话,我实际上也可能会把它变成一个小片段或库。

但实际上,这应该是静态生成的客户端,而不是动态生成的客户端。因为这样验证和生成代码就容易得多。

游乐场


0
投票

Typescript 不允许在接口上添加装饰器。但是,我们可以创建带有空方法的抽象类,并在它们上添加注释。

创建基于注释的 HTTP 客户端的想法是促使我创建 AspectJS 的原因之一。

该库引入了打字稿注释的概念。在幕后,我们确实需要

reflect-metadata
来存储信息,但 AspectJS 会为您处理这个问题。

stackblitz 上的演示

© www.soinside.com 2019 - 2024. All rights reserved.