thrift RPC 定义文件转 d.ts 工具
安装(install): npm install dts-from-thrift -g
运行(exec):
# for thrift
dts-from-thrift -p ~/git/my-thrift-repo/thrift -o ~/git/my-ts-repo/typings
# for pb
dts-from-protobuf -p ~/git/my-protobuf-repo/proto -o ~/git/my-ts-repo/typings
--bail 参数,满足 idl 校验需求thrift 文件中单行注释包含 */ 字符的文件注释会在替换成多行注释时,错误地闭合多行注释。现将所有单行注释中的 */ 字符直接删掉
注释错位问题 fix
--new 传参,只保留 ast 解析/** */ 标注,以使得 vscode 可提示注释内容--i64 参数i64 转换成 string 或 Int64 对象(需要加 --new 参数)
shell
node ./bin/dts-from-[thrift|protobuf] -p ./test/idl/ \
-o ./test/idl/out/ \
--new --i64 string
--enum-json 参数把 thrift idl 中的 const 输出到 d.ts 和 enum.json 中,用于类型提示或者自定义 babel 插件(for byted-react-scripts)
默认输出在 enums.json 文件中
注意:d.ts 中的 const 在编译过程中并不会被转换。效果可以运行根目录下的 run.sh 来查看。
--map 参数支持 thrift idl 中的 map<type_a, type_b> 输出到 Record<string, type_b>
注意:Record 对于 key 的支持只有 number,string,symbol,所以
type_a强制为string。
栗子:
shell
node ./bin/dts-from-[thrift|protobuf] -p ./test/idl/ \
-o ./test/idl/out/ \
--new --i64 string --map
针对 struct 中的 field 是否是 optional 进行了梳理,详见test/thriftNew/readCode.test.ts line649 和下表,主要是针对/\w+Response/i和/\w+Request/i做了特殊处理,以符合实际的 idl 语义
| 是否可选 | requeird | 无(默认) | optional |
|---|---|---|---|
| *response | false | false | true |
| *response & defualt value | False | false | true |
| *request | false | false|true* | true |
| *request & default value | false | true | true |
| Use-strict | false | true | true |
| No-use-strict | false | false | true |
| [^request|response] & Default value | false | true | true |
"*"表示需要标记strict-request开启,表示是业务定制
--strict-response 传参指定后如果 struct 名称包含 Response(例如:ListResponse),那么它的字段如果有 defaultValue 词缀,则此字段不会有 optional 标识
```ts / struct CreateResponse { 255: optional i32 err_no (defaultValue=0); } /
interface CreateResponse { err_no: number; // 不指定的时候是 err_no?: number; } ```
--i64_as_number 参数--i64_as_number 参数,将 i64 降级为 number--new 参数,分别使用 protobufjs 解析 pb、使用 @creditkarma/thrift-parser 解析 thriftthrift Struct 字段如果定义了 defaultValue,生成的 dts 字段将带 ?fields in thrift Struct with defaultValue will attach a ? when in d.ts file
i64 类型会被生成为 Int64 的接口类型。该接口定义在 tsHelper.d.ts 中parse service with multiple params currectly
parse single line service declaration currectly.
typedef generic type fix
${namespace}._Summary_ 接口增加了 WrapperService 推导函数。用来解决 i64 转 number 在 js 下需要特殊处理的问题。可以通过扩展 Int64Type 接口来实现自己的 i64 类型适配Add a type inference wrapper function to process the i64 type. Extends the Int64Type interface for customization.
dts-from-thrift 支持合并 service 到一个定义文件中使用 --rpc-namespace=xxx 来指定需要合并到的 namespace 中,并且可以通过 ${namespace}._Summary_ 来获得一个总的 interface 用以继承
```javascript
dts-from-thrift -p ./ -o ../typings --rpc-namespace=demo.rpc // 你输入的命令 (the Command you input) RPC d.ts files is /Users/xxx/projectpath/typings/demo.rpc-rpc.d.ts // 生成的 rpc 定义文件 (the rpc definition file name) ```
使用 _Summary 继承 rpc 接口 (use _Summary to extends)
typescript
interface MyRPCContainer extends demo.rpc._Summary_ {}
fix service interfaces which are without input params
service RpcService {} 定义(support service definition)
```typescript // thrift sample service RpcService { ResponseType interface1 (1: RequestType req); }
// generate code export interface RpcService { interface1(req: RequestType): Promise; } ```
(add dts-from-protobuf CLI, support protobuf)
dts-from-protobuf -p <protobuf_idl_dir> -o <output_dir>
(add a new option [--use-tag] to replace original fieldname with tagname)
```csharp struct Foo { 1: list comments (go.tag="json:\"list,omitempty\""), }
// before 0.4.0 interface Foo { comments: string[]; }
// after 0.4.0 with [--use-tag go] interface Foo { list: string[]; } // detail in parseStruct.test.ts ```
// prettier-ignore 避免 format 导致的 git 提交(add // prettier-ignore at head of d.ts file to prevent useless git commit)
$ claude mcp add dts-from-thrift \
-- python -m otcore.mcp_server <graph>