7个版本

0.2.2 2022年2月20日
0.2.1 2022年2月20日
0.2.0 2022年1月21日
0.1.3 2022年1月16日

#234 in FFI

MIT 许可证

18KB
276

ts2rs

一个将TypeScript接口定义导入Rust的proc-macro库。

使用方法

参见 docs.rs

待办事项列表

  • 更好的错误报告;
  • 从类定义中导入;
  • 日期和时间等高级类型;

lib.rs:

githubcrates-iodocs-rs


此crate提供了用于将TypeScript接口导入Rust的 import! 宏。

类型映射

目前只支持基本类型,映射如下

Typescript 类型 Rust 类型
string String
number f64
boolean bool
T[] Vec<T>
T? Option<T>
任何用户定义的类型/接口 结构定义(首字母大写)

使用方法

查看 import! 宏。

Cargo 特性

serde

默认情况下,所有接口都被导入为仅派生 Debug 的结构体。

启用此特性将使所有结构体默认派生 serde::Serializeserde::Deserialize

有关更多派生选项,请参阅 派生选项

导入选项

使用以 /** 开头并以 **/ 结尾的注释来指定导入选项。多个选项可以位于同一个注释块中,每个选项以分号 ; 结尾。

重命名

使用 /** rename: <name>; **/ 将字段/接口重命名为 <name>

示例

interface Fries {
  favorite: boolean; /** rename: favourite; **/
  price: number;
} /** rename: Chips; **/

这将导致以下结构体定义

#[derive(Debug)]
pub struct Chips {
  favourite: bool,
  price: f64,
}

重类型

使用 /** retype: <type>; **/ 将字段重类型为 <type>

示例

interface Chocolate {
  price: number; /** retype: i32; **/
}

这将导致以下结构体定义

#[derive(Debug)]
pub struct Chocolate {
  price: i32,
}

跳过

使用 /** skip; **/ 跳过字段/接口。

示例

interface User {
  id: number;
  theme: string; /** skip; **/ // backend doesn't care about this field
}
interface Advertisement {
  id: number;
  url: string;
} /** skip; **/ // backend doesn't care about this interface

这将导致以下结构体定义

#[derive(Debug)]
pub struct User {
  id: f64,
}

派生

使用 /** derive: <derive>; **/ 为接口派生一个特质。

示例

interface User {
  id: number;
} /** derive: PartialEq; derive: Eq; **/

这将导致以下结构体定义

#[derive(Debug, PartialEq, Eq)]
pub struct User {
  id: f64,
}

跳过 Serde 派生

使用 /** skip_derive_serde; **/ 跳过接口的 serde 派生。

示例

interface User {
  id: number;
} /** skip_derive_serde; **/

这将导致以下结构体定义

#[derive(Debug)]
pub struct User {
  id: f64,
}

依赖项

~2.2–3MB
~58K SLoC