gRPC TypeScript代码生成后遇TS2345类型不兼容错误求助
gRPC TypeScript类型不匹配错误解决方案
问题背景
使用以下npm脚本命令生成gRPC TypeScript代码:
"proto": "npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./grpc/client --grpc_out=./grpc/client --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` -I ./grpc/proto ./grpc/proto/*.proto && npx grpc_tools_node_protoc --plugin=protoc-gen-ts=`which protoc-gen-ts` --ts_out=./grpc/client -I ./grpc/proto ./grpc/proto/*.proto",
执行后出现TypeScript编译错误:
Services/SchoolService.ts:205:23 - error TS2345: Argument of type 'ISchoolService' is not assignable to parameter of type 'ServiceDefinition<UntypedServiceImplementation>'. Index signature for type 'string' is missing in type 'ISchoolService'. 205 server.addService(SchoolService, new ServerImpl());
环境信息
- 系统:Ubuntu 24.04
- Node.js版本:22.4.1(apt安装)
- 编译器:g++ 13.2.0
- 依赖版本:
"grpc_tools_node_protoc_ts": "^5.3.3", "@grpc/grpc-js": "^1.10.10",
解决方案
1. 修改代码生成命令
生成代码时需指定grpc_js模式,适配@grpc/grpc-js的类型系统,修改后的npm脚本:
"proto": "npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./grpc/client --grpc_out=grpc_js:./grpc/client --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` -I ./grpc/proto ./grpc/proto/*.proto && npx grpc_tools_node_protoc --plugin=protoc-gen-ts=`which protoc-gen-ts` --ts_out=grpc_js:./grpc/client -I ./grpc/proto ./grpc/proto/*.proto",
核心改动:
--grpc_out=grpc_js:./grpc/client:生成适配@grpc/grpc-js的JS服务代码--ts_out=grpc_js:./grpc/client:生成带字符串索引签名的TS类型定义,匹配ServiceDefinition要求
2. 调整服务注册代码
生成的TS文件中,正确的服务定义导出名称应为[服务名]ServiceService,修改注册行:
server.addService(SchoolServiceService, new ServerImpl());
注:可查看生成的.ts文件确认具体导出名称,通常会和ISchoolService同文件导出。
3. 确认依赖版本匹配
当前grpc_tools_node_protoc_ts@5.3.3与@grpc/grpc-js@1.10.10版本兼容,若问题仍存在,可重新安装依赖确保版本锁定:
npm install grpc_tools_node_protoc_ts@5.3.3 --save-dev
原因说明
未指定grpc_js模式时,生成的类型是针对旧版grpc库的,缺少@grpc/grpc-js要求的字符串索引签名,导致类型不兼容。添加grpc_js参数后,生成的类型会完全匹配ServiceDefinition的结构要求。
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

