首页 > 解决方案 > 使用 ts-protoc-gen 从 .protobuf 文件生成类型定义,结果仅包含原始接口定义,除了 jspb.Message 原型

问题描述

我正在使用protobuf库来为平台之间共享的数据结构生成代码。其中一个平台是 nodejs,我在上面使用 typescript。所以除了协议编译器(https://developers.google.com/protocol-buffers/docs/reference/javascript-generated)我还使用ts-protoc-gen插件(https://github.com/improbable-eng/ts -protoc-gen ) 以生成类型定义,以便对生成的代码使用静态类型。

ts-protoc-gen 不仅应该生成简单的接口定义,还应该基于 .proto 文件中定义的消息生成实际的类定义。我已经为其中一个插件示例 orphan.proto 生成了类型定义。 https://github.com/improbable-eng/ts-protoc-gen/blob/master/proto/orphan.proto 提供了应该生成的结果,例如。对于 OrphanMessage 看起来像这样:

export class OrphanMessage extends jspb.Message {
  getMyString(): string;
  setMyString(value: string): void;

  getMyBool(): boolean;
  setMyBool(value: boolean): void;

  getMyEnum(): OrphanEnumMap[keyof OrphanEnumMap];
  setMyEnum(value: OrphanEnumMap[keyof OrphanEnumMap]): void;

  serializeBinary(): Uint8Array;
  toObject(includeInstance?: boolean): OrphanMessage.AsObject;
  static toObject(includeInstance: boolean, msg: OrphanMessage): OrphanMessage.AsObject;
  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
  static serializeBinaryToWriter(message: OrphanMessage, writer: jspb.BinaryWriter): void;
  static deserializeBinary(bytes: Uint8Array): OrphanMessage;
  static deserializeBinaryFromReader(message: OrphanMessage, reader: jspb.BinaryReader):
}

(来源https://github.com/improbable-eng/ts-protoc-gen/blob/master/examples/generated/proto/orphan_pb.d.ts

但我得到的结果只是一个原始接口,实际上由于样式不同,它与 _pb.js 文件中生成的 .js 代码不兼容。

export interface OrphanMessage {
    my_string?: string;
    my_bool?: boolean;
    my_enum?: OrphanEnum;
}

有人知道为什么我没有得到 jspb.Message 原型吗?我使用以下命令生成带有类型定义的 .js 代码

protoc --plugin="/protoc-gen-ts=${PROTOC_GEN_TS_PATH}" --js_out="import_style=commonjs,binary:%TARGET_PATH%" --ts_out=%TARGET_PATH% %SOURCE_PROTO_FILE_NAME%.proto

标签: typescriptprotocol-buffersprotocprotobuf.js

解决方案


推荐阅读