问题描述
我有以下 protobuf 消息:
Syntax = "proto3";
message MyMessage {
string id = 1;
map<string,Any> attributeChanges = 2;
}
在打字稿中,我试图根据看起来像这样的打字稿地图来设置 protobuf 消息的地图条目。
type Nullable<T> = T | undefined | null;
export interface IAuditChanges {
currentValue: Nullable<string>;
prevIoUsValue: Nullable<string>;
fields?: Map<string,IAuditChanges>
}
我尝试遍历地图对象中的条目并以这种方式设置地图条目。
var attributesMap = message.getAttributechangesMap();
for (let key of Array.from(mappedChanges.keys())) {
const mapEntry: any = mappedChanges.get(key);
attributesMap.set(key,mapEntry);
}
我收到错误“类型错误:b.toArray 不是函数。”知道如何转换/序列化/打包每个打字稿映射条目以便我将其设置在 protobuf 中吗?我已经在几个地方寻找过运气不佳的例子。
https://developers.google.com/protocol-buffers/docs/proto3#any https://developers.google.com/protocol-buffers/docs/proto3#maps
谢谢。
解决方法
Protobuf Any
与 TypeScript any
非常不同。 TypeScript any
允许任何可能的 JavaScript 值。
另一方面,Protobuf Any
是一个正好有两个字段的消息:
-
value:一个 protobuf 消息,以二进制格式编码
-
type_url:protobuf 消息类型的标识符
这意味着您不能只在 Any
字段中放入任何内容。它必须是一个 protobuf 消息,打包到一个 protobuf Any
中。
JavaScript 参考实际上有一个例子:https://developers.google.com/protocol-buffers/docs/reference/javascript-generated#any
我建议为“IAuditChanges”编写一个 protobuf 消息。您很可能根本不需要 Any
。