Proto Utils
面向 VS Code 的 Proto3 插件,提供语法高亮、跳转到定义和 TypeScript 类型生成。插件内置 Proto3 解析器,无需安装 protoc、buf 或其他命令行工具。
功能
- 为
.proto 文件提供 Proto3 语法高亮
- 区分内置标量类型和自定义类型
- 支持同文件、导入文件和 package 命名空间中的类型定义跳转
- 将
message、enum、repeated、map 和 oneof 生成为 TypeScript 类型
- 根据多个
.proto 文件之间的类型引用生成 TypeScript import type
基本使用
编辑和跳转
在工作区中打开 .proto 文件后,插件会自动激活并索引工作区内的 Proto3 文件。
- 语法高亮会自动生效。
- 按住
Ctrl 并点击类型名称,可跳转到对应的 message 或 enum 定义。
- macOS 使用
Cmd + 点击。
跨文件跳转需要目标类型所在的文件位于当前 VS Code 工作区中,并通过 Proto import 或 package 名称可解析。
生成 TypeScript 类型
可以通过以下任一方式生成类型:
- 在编辑器或资源管理器中右键点击
.proto 文件,然后选择 Proto Utils: Generate TypeScript Types。
- 打开命令面板,运行 Proto Utils: Generate TypeScript Types。使用命令面板时,应先打开目标
.proto 文件。
默认情况下,生成文件写入工作区的 generated/ 目录。若 Proto 文件包含:
syntax = "proto3";
package account.profile;
message User {
string user_name = 1;
repeated string roles = 2;
}
默认输出路径为:
generated/account/profile.ts
生成内容类似:
// Generated by proto-utils. Do not edit.
export interface User {
userName: string;
roles: string[];
}
每次执行生成命令都会覆盖对应的输出文件,请勿手动修改生成文件。
配置
在 VS Code 设置中搜索 Proto Utils,或在工作区的 .vscode/settings.json 中配置 protoUtils.codeGen.*。
| 配置项 |
类型与可选值 |
默认值 |
作用 |
protoUtils.codeGen.outputDir |
string |
"generated" |
输出目录,相对于工作区根目录 |
protoUtils.codeGen.enumStyle |
"enum" | "union" |
"enum" |
将 Proto enum 生成为 TypeScript enum 或字符串字面量联合类型 |
protoUtils.codeGen.optionalMessageFields |
boolean |
true |
是否为非 repeated 的 message 类型字段添加 ? |
protoUtils.codeGen.optionalScalarFields |
boolean |
false |
是否为标量字段添加 ? |
protoUtils.codeGen.fieldNaming |
"camelCase" | "preserve" |
"camelCase" |
将字段名转换为 camelCase,或保留 Proto 原始名称 |
protoUtils.codeGen.pathMapping |
"package" | "file" |
"package" |
根据 Proto package 或源文件相对路径确定输出路径 |
protoUtils.codeGen.oneofStyle |
"optional" | "union" |
"optional" |
将 oneof 生成为可选字段或互斥联合类型 |
示例配置:
{
"protoUtils.codeGen.outputDir": "src/generated",
"protoUtils.codeGen.enumStyle": "union",
"protoUtils.codeGen.optionalMessageFields": true,
"protoUtils.codeGen.optionalScalarFields": false,
"protoUtils.codeGen.fieldNaming": "camelCase",
"protoUtils.codeGen.pathMapping": "package",
"protoUtils.codeGen.oneofStyle": "union"
}
输出路径映射
使用 "package" 时,插件优先根据 package 生成路径:
package my.service;
对应:
<outputDir>/my/service.ts
如果文件没有 package,则回退到源文件相对于工作区根目录的路径。
使用 "file" 时,插件保留源文件相对于工作区根目录的路径,并将 .proto 替换为 .ts。例如:
protos/account/user.proto
对应:
<outputDir>/protos/account/user.ts
类型映射
| Proto3 类型 |
TypeScript 类型 |
double、float |
number |
| 各种 32/64 位整数类型 |
number |
bool |
boolean |
string |
string |
bytes |
Uint8Array |
repeated T |
T[] |
map<K, V> |
Record<K, V> |
message |
interface |
enum |
enum 或字符串字面量联合类型 |