尝试在 Typescript

问题描述

我有以下 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 是一个正好有两个字段的消息:

  1. value:一个 protobuf 消息,以二进制格式编码

  2. type_url:protobuf 消息类型的标识符

这意味着您不能只在 Any 字段中放入任何内容。它必须是一个 protobuf 消息,打包到一个 protobuf Any 中。

JavaScript 参考实际上有一个例子:https://developers.google.com/protocol-buffers/docs/reference/javascript-generated#any

我建议为“IAuditChanges”编写一个 protobuf 消息。您很可能根本不需要 Any

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...