如何从Protobuf生成值为自定义字符串的TypeScript常量枚举?
Protobuf生成TypeScript自定义字符串常量枚举配置方法
默认配置下Protobuf生成的TS枚举为数字值,要实现Language.en = "ENGLISH"这类自定义字符串值的常量枚举,根据你使用的生成工具按以下方式配置:
方案一:使用ts-proto生成插件(推荐)
ts-proto是目前生态最完善的TS Protobuf生成插件,原生支持自定义字符串枚举配置:
- 先在你的.proto文件中引入ts-proto的选项定义,给每个枚举成员指定要映射的字符串值:
syntax = "proto3"; import "ts-proto.proto"; enum Language { en = 0 [(ts_proto.enumValueName) = "ENGLISH"]; jp = 1 [(ts_proto.enumValueName) = "JAPANESE"]; ar = 2 [(ts_proto.enumValueName) = "ARABIC"]; }
- 执行生成命令时追加两个参数:
--ts_proto_opt=stringEnums=true:开启字符串枚举模式--ts_proto_opt=constEnums=true:开启TS常量枚举(const enum)生成
- 最终生成的代码效果和需求完全一致:
export const enum Language { en = "ENGLISH", jp = "JAPANESE", ar = "ARABIC" }
插件会自动处理序列化/反序列化逻辑,字符串值仅存在于TS编译时层面,底层Protobuf序列化依然会使用对应的数字枚举值,不会破坏协议兼容性。
如果你不想修改.proto文件,也可以在ts-proto的配置文件中传入全局枚举值映射表,指定每个枚举成员对应的字符串值,不需要在proto中加注解。
方案二:使用protobuf-ts生成插件
protobuf-ts原生支持字符串枚举生成,但不支持直接在proto中注解自定义字符串值:
- 生成时追加参数
--ts_opt=string_enums,const_enum,会先生成键值同名的字符串枚举,格式为Language.en = "en" - 写一个简单的Node脚本在生成流程结束后执行,按照你需要的映射关系替换枚举值即可,示例替换逻辑:
import fs from 'fs'; const fileContent = fs.readFileSync('./out/language.ts', 'utf-8'); const replaced = fileContent .replace('en = "en"', 'en = "ENGLISH"') .replace('jp = "jp"', 'jp = "JAPANESE"') .replace('ar = "ar"', 'ar = "ARABIC"'); fs.writeFileSync('./out/language.ts', replaced);
注意事项
- 所有字符串枚举都是TS层面的语法糖,Protobuf协议本身只支持整数类型的枚举值,不要修改proto中枚举的数字定义,否则会导致协议解析失败。
- 如果不需要常量枚举的内联效果,去掉
constEnums相关参数即可生成普通字符串枚举。
内容的提问来源于stack exchange,提问作者rksh1997
相关产品推荐
相关产品推荐

