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

如何用ts-proto生成同时兼容NestJS与TypeScript的Proto文件?

解决ts-proto同时生成NestJS服务端兼容代码与TypeScript客户端实现的问题

首先纠正一个常见参数拼写错误:ts-proto中控制客户端实现生成的参数是clientImpl(不是你提到的clientImp),这可能是你之前配置无效的原因之一。

方法一:通过复合配置同时生成两种代码

直接在编译命令或配置文件中同时开启nestjs=true和clientImpl=true,并指定客户端类型,即可生成同时兼容NestJS服务端和TypeScript客户端的代码。

示例protoc命令:

protoc \
  --plugin=./node_modules/.bin/protoc-gen-ts_proto \
  --ts_proto_out=./src/proto \
  --ts_proto_opt=nestjs=true,clientImpl=true,outputClientImpl=grpc-web \
  ./proto/*.proto

示例buf.yaml配置:

version: v1
plugins:
  - name: ts_proto
    out: src/proto
    opt:
      - nestjs=true
      - clientImpl=true
      - outputClientImpl=grpc-node # 根据客户端环境选择grpc-web/grpc-node等

生成的文件会同时包含:

  • NestJS服务端所需的控制器接口(如UserServiceController),你的NestJS控制器类可以直接实现该接口,保证与proto定义的一致性
  • TypeScript客户端实现类(如UserServiceClient),可直接在客户端代码中实例化并调用服务方法

方法二:分两次生成(适用于旧版ts-proto)

如果上述复合配置在你使用的ts-proto版本中不生效,可以分两次编译:

  1. 第一次编译生成NestJS服务端代码:
protoc \
  --plugin=./node_modules/.bin/protoc-gen-ts_proto \
  --ts_proto_out=./server/src/proto \
  --ts_proto_opt=nestjs=true \
  ./proto/*.proto
  1. 第二次编译生成客户端代码:
protoc \
  --plugin=./node_modules/.bin/protoc-gen-ts_proto \
  --ts_proto_out=./client/src/proto \
  --ts_proto_opt=clientImpl=true,outputClientImpl=grpc-web \
  ./proto/*.proto

这种方式虽然会生成两份类型定义,但能确保服务端和客户端各自获取所需的代码。

注意事项

  • 确保使用最新版的ts-proto,旧版本可能存在同时开启两个选项的兼容性问题
  • outputClientImpl参数需根据你的客户端环境选择:grpc-web用于浏览器端,grpc-node用于Node.js客户端,grpc-js用于基于@grpc/grpc-js的客户端

内容的提问来源于stack exchange,提问作者Hammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:00