1 个不稳定版本
0.1.0 | 2020 年 10 月 23 日 |
---|
#1918 在 编码
40KB
1K SLoC
bincode-typescript
从 Rust 结构体和枚举生成 TypeScript 序列化和反序列化代码
目标
- 直接从 Rust 源代码生成 TypeScript 代码
- TypeScript 必须在
strict
模式下编译 - 避免面向对象的 TypeScript 以获得更好的 tree-shaking 和优化
- TypeScript 应该易于使用且性能高
- 对于单元枚举,使用
const enum
并尊重区分值! - 对于性能,使用
TypedArray
和复制字节块来处理Vec<{integer,float}>
- 对于单元枚举,使用
状态
我对 Rust 比较新,我只是胡乱修改直到测试通过 🤷♂️
还有很多改进的空间,欢迎提交 PR!
请查看 目前支持的 Rust 类型及其 TypeScript 对应类型 的源代码。
您还可以查看测试中使用的 Rust 类型 以及由此生成的 TypeScript。
当前问题和限制
- 所有值都必须是拥有的
- 泛型结构体/枚举几乎肯定会导致 panic
- 所有类型必须位于单个文件中
- 当前不尊重 Serde 属性
Vec<{T>
总是在可能的情况下转换为Uint8Array/Int8Array/等
,但这可能并不总是所需的。- 由于全局使用
TextEncoder/TextDecoder
,生成的代码在 node < v11 上将无法工作
通过 build.rs
的示例
目前有一个选项 bool
用于启用对 node.js Buffer
的支持,因此如果您在浏览器中运行,可能不需要启用此选项。
bincode_typescript::from_file("./src/types.rs", "./ts/types.ts", false);
通过 CLI 的示例
目前有一个选项(--buffer-support
)可以启用对 node.js Buffer
的支持。
./bincode-typescript --support-buffer ./src/types.rs > ./ts/types.ts
测试
在运行测试之前,请确保您已通过运行 yarn
或 npm i
安装了所有 node.js 依赖项。
测试检查从生成的 TypeScript 进行序列化和反序列化,通过在 stdio 中往返编码数据并断言预期值。
现有技术
这基于以下项目(即从这些项目中借鉴了大量 TypeScript)。
所述的优缺点仅代表个人观点!
ts-rust-bridge
优点
- 基于函数的 TypeScript API
- 对于枚举,结合
type
+interface
+module
具有出色的易用性
缺点
- 从 DSL 生成 Rust 和 TypeScript。(我希望 Rust 是真理的来源)
- 单元枚举不使用
const enum
serde-反射/serde-生成
优点
- 使用
serde
,因此无需解析 Rust
缺点
- 必须在构建后通过注册表运行所有类型,因此无法从
build.rs
运行 - TypeScript 类包装每个类型并使用继承(即没有
const enum
) - 运行时 TypeScript 是独立的
依赖项
~3.5MB
~73K SLoC