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

如何从Protobuf生成值为自定义字符串的TypeScript常量枚举?

Protobuf生成TypeScript自定义字符串常量枚举配置方法

默认配置下Protobuf生成的TS枚举为数字值,要实现Language.en = "ENGLISH"这类自定义字符串值的常量枚举,根据你使用的生成工具按以下方式配置:


方案一:使用ts-proto生成插件(推荐)

ts-proto是目前生态最完善的TS Protobuf生成插件,原生支持自定义字符串枚举配置:

  1. 先在你的.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"];
}
  1. 执行生成命令时追加两个参数:
    • --ts_proto_opt=stringEnums=true:开启字符串枚举模式
    • --ts_proto_opt=constEnums=true:开启TS常量枚举(const enum)生成
  2. 最终生成的代码效果和需求完全一致:
export const enum Language {
  en = "ENGLISH",
  jp = "JAPANESE",
  ar = "ARABIC"
}

插件会自动处理序列化/反序列化逻辑,字符串值仅存在于TS编译时层面,底层Protobuf序列化依然会使用对应的数字枚举值,不会破坏协议兼容性。

如果你不想修改.proto文件,也可以在ts-proto的配置文件中传入全局枚举值映射表,指定每个枚举成员对应的字符串值,不需要在proto中加注解。


方案二:使用protobuf-ts生成插件

protobuf-ts原生支持字符串枚举生成,但不支持直接在proto中注解自定义字符串值:

  1. 生成时追加参数--ts_opt=string_enums,const_enum,会先生成键值同名的字符串枚举,格式为Language.en = "en"
  2. 写一个简单的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:48:09