Попытка установить записи карты protobuf в 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);
}

Я получаю сообщение об ошибке TypeError: b.toArray не является функцией. Любая идея, как я могу преобразовать / сериализовать / упаковать каждую запись карты машинописного текста, чтобы я установил ее в protobuf? Я безуспешно искал в нескольких местах примеры.

https://developers.google.com/protocol-buffers/docs/proto3#any https://developers.google.com/protocol-buffers/docs/proto3#maps

Спасибо.


person user906573    schedule 12.02.2021    source источник


Ответы (1)


Protobuf Any сильно отличается от TypeScript any. TypeScript any допускает любое возможное значение JavaScript.

Protobuf Any, с другой стороны, представляет собой сообщение с ровно двумя полями:

  1. значение: сообщение protobuf, закодированное в двоичном формате

  2. type_url: идентификатор типа сообщения protobuf

Это означает, что вы не можете просто поместить что-либо в поле Any. Это должно быть сообщение protobuf, упакованное в protobuf Any.

В справочнике по JavaScript есть пример: https://developers.google.com/protocol-buffers/docs/reference/javascript-generated#any

Я рекомендую написать сообщение protobuf для IAuditChanges. Вам, скорее всего, Any вообще не понадобится.

person Timo Stamm    schedule 07.04.2021
comment
Спасибо. Это именно то, что я в итоге сделал. - person user906573; 11.05.2021