typescript - 尝试在 Typescript 中设置 protobuf Map 条目
问题描述
我有以下 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);
}
我收到错误“TypeError:b.toArray 不是函数。” 知道如何转换/序列化/打包每个打字稿映射条目,以便将其设置在 protobuf 中吗?我在几个地方找了一些没有运气的例子。
https://developers.google.com/protocol-buffers/docs/proto3#any https://developers.google.com/protocol-buffers/docs/proto3#maps
谢谢你。
解决方案
ProtobufAny
与 TypeScript 非常不同any
。TypeScriptany
允许任何可能的 JavaScript 值。
Any
另一方面,Protobuf是一个包含两个字段的消息:
value:一个protobuf消息,以二进制格式编码
type_url:protobuf 消息类型的标识符
这意味着您不能只在Any
字段中放置任何内容。它必须是一个 protobuf 消息,打包到一个 protobufAny
中。
JavaScript 参考实际上有一个例子:https ://developers.google.com/protocol-buffers/docs/reference/javascript-generated#any
我建议为“IAuditChanges”编写一个 protobuf 消息。你很可能根本不需要Any
。
推荐阅读
- html - 如何让图像忽略父 div 填充?
- emacs - 有没有办法在 emacs org-mode 中隐藏除最后一个标题星号之外的所有标题?
- python - 如何有效地滑动numpy数组?
- lightningchart - 向下滚动闪电图 JS
- css - 输入字段内的输入文本重叠按钮
- sql-server - 使用额外的表扩展 SQL Server 查询 - 非常复杂的查询(至少对我而言)
- excel - Excel 中的数据栏不准确
- sql - 从 Oracle 中的会话中获取更改的对象
- python-3.x - 腌制深度学习模型时出现“TypeError:无法腌制弱引用对象”
- typescript - 具有动态字段名称的类型化 Zod 组合器