4 个版本 (重大更改)

0.5.0 2022年3月12日
0.4.0 2022年2月21日
0.2.0 2022年2月8日
0.1.0 2022年1月31日

FFI 中排名第 310

MIT/Apache

505KB
13K SLoC

ts-bindgen — CI 最新版本 Rust 文档 Crates.io

ts-bindgen: 自动从 TypeScript 定义生成 Rust wasm-bindgen 绑定,以便轻松地从编译为 wasm 的 Rust 与 JavaScript 库交互。

在浏览器中试用

前往 ts-bindgen.ratchetdesigns.com,将 TypeScript 定义复制/粘贴到浏览器中,现在就可以在浏览器中试用 ts-bindgen,并查看它生成的 Rust 绑定。

状态

ts-bindgen 目前是 alpha 软件版本,因此应该预期任何或所有以下内容都可能在版本之间发生重大变化

  1. 生成的绑定
  2. 公开的接口
  3. 内部实现

目前存在已知问题,将阻止为某些 TypeScript 习惯用法生成合理的绑定。

我们欢迎贡献和问题报告!

快速入门

前往 ts-bindgen.ratchetdesigns.com,在浏览器中复制/粘贴 TypeScript 定义以生成 Rust 绑定。

要开始在 Rust 项目中生成绑定,您有以下几种选择

  1. 运行 cargo run ts-bindgen -- --output src/bindings.rs your-ts-moduleyour-ts-module 生成 src/bindings.rs,其中 your-ts-module./path/to/defs.d.ts/path/to/defs.d.tsmodule-in-node_modules
  2. 在您的 build.rs 中调用 cargo run ts-bindgen -- --output src/bindings.rs --rerun-if-changed your-ts-module
  3. ts-bindgen = { version = "0.5.0", default-features = false } 添加到您的 cargo.toml 依赖项中,并在您的 build.rs 中调用 ts_bindgen::generate_rust_string_for_typescript(ts_bindgen::StdFs, "your-module")。注意:虽然 ts-bindgen 可执行文件会对生成的绑定进行 rustfmt,但 generate_rust_string_for_typescript 不会。

生成的绑定依赖于 ts-bindgen 运行时:ts-bindgen-rt、wasm-bindgen、serde 以及(可选)js-sys 和 web-sys,因此请将以下内容添加到您的 Cargo.toml

[dependencies]
ts-bindgen-rt = "0.5.0"
wasm-bindgen = "0.2.63"
serde = { version = "1.0", features = ["derive"] }
js-sys = "0.3.53" # optional, depending on your input typescript
web-sys = { version = "0.3.53", features = ["Window"] } # optional, update with features for any types your bindings use

生成的绑定

ts-bindgen 寻求合理的 Rust 用户体验,并经常包装 wasm-bindgen 绑定以提供(希望是)更“Rust-like”的接口。例如,函数和方法被包装以转换它们的参数和返回值到/从 JavaScript/Rust 表示形式,JavaScript 类被包装在 newtype 结构体中,并且为 JavaScript 类继承层次结构生成特质。为了更忠实地保留 JavaScript 的 null/undefined、函数等语义,我们实现了一个类似于 serde-wasm-bindgen 的自定义(反)序列化器,在 JsValues 和生成的绑定之间进行序列化。我们预计还有很多尚未探索的性能改进机会。

结构

ts-bindgen 由几个 crate 组成

  • ts-bindgen - 公共接口,包括 ts-bindgen 可执行文件和库
  • ts-bindgen-gen - 解析 ts 和生成 Rust 绑定的核心
  • ts-bindgen-rt - 生成绑定所依赖的运行时
  • ts-bindgen-web(未发布)- 用于 ts-bindgen.ratchetdesigns.com 的代码
  • ts-bindgen-macro(未发布)- 可能不是一个好的宏来生成绑定。绑定已变得过于复杂,不能在编码时检查它们,而 ts-bindgen-gen 也没有尝试保留宏卫生。

许可

版权所有 2022 Adam Berger,Ratchet Designs。

ts-bindgen 可以根据您的选择,在 MITApache 许可下获得许可。

致谢

ts-bindgen 由 Ratchet Designs 精心制作。

依赖项

~16–30MB
~498K SLoC