返回

对 Web 请求的 TypeScript 封装 2.0 版:解决全部痛点!

前端

前言

在上一篇文章《封装》中,我们介绍了如何将 gRPC 封装成 TypeScript,使其能够在 Web 请求中使用。这种封装方案已经可以在实践中使用了,但是还存在两处不完美的地方:

  1. 复杂类型入参的处理:如果请求的入参是复杂类型(如对象、数组等),则需要对入参进行序列化和反序列化。这可能会导致代码变得复杂且难以维护。
  2. 必须传入 requestClass:在封装后的 gRPC 函数中,必须传入 requestClass 参数。这可能会导致代码变得冗长且难以阅读。

针对这两个痛点,我们在本文中提出了改进方案,使其更加完善和易于使用。

改进方案

1. 解决复杂类型入参的处理

为了解决复杂类型入参的处理问题,我们引入了一个新的库:protobufjs。这个库可以帮助我们轻松地将复杂类型序列化和反序列化为 JSON 字符串。

在使用 protobufjs 库之前,我们需要先安装它:

npm install protobufjs

安装完成后,我们就可以在代码中使用它了。

封装过程:

  1. 使用 protobufjs 库将复杂类型序列化为 JSON 字符串。
  2. 将 JSON 字符串作为入参传入到 gRPC 函数中。
  3. 在 gRPC 函数中,使用 protobufjs 库将 JSON 字符串反序列化为复杂类型。

封装后的函数:

const sayHello = (request: { name: string }, callback: (error: Error | null, response: { message: string }) => void): void => {
  const requestJSON = protobufjs.Root.fromJSON(request).toJSON();
  grpcClient.sayHello(requestJSON, (error, response) => {
    if (error) {
      callback(error, null);
      return;
    }
    const responseJSON = protobufjs.Root.fromJSON(response).toJSON();
    callback(null, responseJSON);
  });
};

2. 解决必须传入 requestClass 的问题

为了解决必须传入 requestClass 的问题,我们使用了一个新的语法糖:as

在使用 as 语法糖之前,我们需要先安装 typescript-rest 库:

npm install typescript-rest

安装完成后,我们就可以在代码中使用它了。

使用过程:

在 gRPC 函数的参数列表中,使用 as 语法糖来指定 requestClass。

封装后的函数:

const sayHello = (request: proto.helloworld.HelloRequest as any, callback: (error: Error | null, response: proto.helloworld.HelloReply) => void): void => {
  grpcClient.sayHello(request, callback);
};

使用示例

在实际使用中,我们可以按照以下步骤来封装 gRPC:

  1. 安装 protobufjstypescript-rest 库。
  2. 使用 protobufjs 库将复杂类型序列化为 JSON 字符串。
  3. 将 JSON 字符串作为入参传入到 gRPC 函数中。
  4. 在 gRPC 函数中,使用 protobufjs 库将 JSON 字符串反序列化为复杂类型。
  5. 使用 as 语法糖来指定 requestClass。

这样,我们就可以轻松地将 gRPC 封装成 TypeScript,并在 Web 请求中使用它了。

总结

本文介绍了如何改进 TypeScript 封装 gRPC 的方案,解决了复杂类型入参的处理和必须传入 requestClass 这两个痛点。这种封装方案更加完善和易于使用,可以广泛应用于各种 Web 请求的封装场景中。

希望这篇文章对您有所帮助,如果您有任何疑问,欢迎在评论区留言。