<aside> 💡 首先可以看下参考里的 Protocol Buffer 基础文档
</aside>
.proto 文件在转换之后,会生成两种类型的文件,一个是以 .pd.ts/js 结尾的,生成所有Request Response 或其他需要构造出的Message 类.
在转换后的文件中,不难看出两者的对应关系: Typesctipt, Protocol Buffer语法有一定的相似性,大概为这样:
| Proto | TS | 描述 |
|---|---|---|
| message | interface | 定义消息体,提供给rpc服务使用 |
| service | class | 定义服务,需要在service中定义rpc方法,再传入message,必须return 一个响应体 |
| repeated | Array<T> | 可重复字段次数 |
| string | string | |
| int32/int64 | number | |
| enum | enum | |
| Map | Map | Map 字段和 repeated冲突,不能同时使用,map类型需要设置键和值的类型 |
需要注意的点:
proto 中的字段名会在 TS 中转化为***小驼峰 (camelCase),***一般是set+Field get+Field 形式.repeated 修饰的字段名会被自动加 List 后缀.在生成后的.ts 代码中,大致结构类似这种:
message User {
int64 id = 1;
...
repeated EducationalExperience educational_experience = 34;
...
repeated WorkExperience work_experience = 36;
...
AdditionalMaterials additional_materials = 38;
...
repeated Group groups = 44;
Job job = 45; // 紫色字体的为 Message
}
export class User extends jspb.Message {
getId(): number;
setId(value: number): User;
getExperienceList(): Array<EducationalExperience>;
setExperienceList(value: Array<EducationalExperience>): User;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): User.AsObject;
static toObject(includeInstance: boolean, msg: User): User.AsObject;
static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): User;
static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User;
}
export namespace User {
export type AsObject = {
id: number,
...
educationalExperienceList: Array<EducationalExperience.AsObject>,
}
}
可以看出,每一个Message 都会生成一个Class和一个namespace , 分别对应的是: