22个版本

0.5.11 2024年2月9日
0.5.9 2023年11月28日
0.5.7 2023年7月9日
0.5.6 2023年2月14日
0.2.1 2021年7月10日

#137Web编程 类别中

Download history 596/week @ 2024-04-21 1028/week @ 2024-04-28 837/week @ 2024-05-05 1212/week @ 2024-05-12 982/week @ 2024-05-19 571/week @ 2024-05-26 707/week @ 2024-06-02 349/week @ 2024-06-09 426/week @ 2024-06-16 289/week @ 2024-06-23 471/week @ 2024-06-30 561/week @ 2024-07-07 290/week @ 2024-07-14 475/week @ 2024-07-21 1018/week @ 2024-07-28 686/week @ 2024-08-04

2,497 每月下载量
7 包中使用(直接使用4个)

MIT 许可证

77KB
1K SLoC

Crates.io Build Status docs.rs

typescript-type-def

为Rust类型生成TypeScript类型定义。

此包允许您生成一个TypeScript模块,其中包含描述Rust类型JSON序列化的类型定义。预期用途是定义TypeScript类型,用于将Rust类型序列化为JSON,使用 serde_json,以便可以在TypeScript中安全使用,无需维护并行的一组类型定义。

此包的一个有用例子是在使用Rust后端和TypeScript前端的工作中。如果用于在两者之间通信的数据在Rust中定义,并使用 serde_json 对其进行编码/解码以便通过网络传输,则可以使用此包自动生成这些类型的TypeScript定义文件,以便在您的前端代码中安全使用。如果使用此包作为服务器构建脚本,此过程甚至可以完全自动化,将定义文件写入TypeScript源代码目录。

您还可以使用此库生成的TypeScript类型信息来编写使用这些类型定义的TypeScript代码。实现了 TypeDef 的Rust类型有一个关联的常量 TypeDef::INFO,它有一个可以用于此目的的方法 TypeInfo::write_ref_expr

特性

  • json_value - 为从 serde_json 的 JSON 值类型添加 TypeDef 实现。

示例

简单示例

use serde::Serialize;
use typescript_type_def::{
    write_definition_file,
    DefinitionFileOptions,
    TypeDef,
};

#[derive(Serialize, TypeDef)]
struct Foo {
    a: usize,
    b: String,
}

let ts_module = {
    let mut buf = Vec::new();
    let options = DefinitionFileOptions::default();
    write_definition_file::<_, Foo>(&mut buf, options).unwrap();
    String::from_utf8(buf).unwrap()
};
assert_eq!(
    ts_module,
    r#"// AUTO-GENERATED by typescript-type-def

export default types;
export namespace types{
export type Usize=number;
export type Foo={"a":types.Usize;"b":string;};
}
"#
);

let foo = Foo {
    a: 123,
    b: "hello".to_owned(),
};
let json = serde_json::to_string(&foo).unwrap();
// This JSON matches the TypeScript type definition above
assert_eq!(json, r#"{"a":123,"b":"hello"}"#);

当处理由许多类型组成的大型代码库时,声明一个列出您希望为其创建定义的所有类型的“API”类型别名是一个有用的模式。例如

use serde::Serialize;
use typescript_type_def::{write_definition_file, TypeDef};

#[derive(Serialize, TypeDef)]
struct Foo {
    a: String,
}

#[derive(Serialize, TypeDef)]
struct Bar {
    a: String,
}

#[derive(Serialize, TypeDef)]
struct Baz {
    a: Qux,
}

#[derive(Serialize, TypeDef)]
struct Qux {
    a: String,
}

// This type lists all the top-level types we want to make definitions for.
// You don't need to list *every* type in your API here, only ones that
// wouldn't be referenced otherwise. Note that `Qux` is not mentioned, but
// is still emitted because it is a dependency of `Baz`.
type Api = (Foo, Bar, Baz);

let ts_module = {
    let mut buf = Vec::new();
    write_definition_file::<_, Api>(&mut buf, Default::default()).unwrap();
    String::from_utf8(buf).unwrap()
};
assert_eq!(
    ts_module,
    r#"// AUTO-GENERATED by typescript-type-def

export default types;
export namespace types{
export type Foo={"a":string;};
export type Bar={"a":string;};
export type Qux={"a":string;};
export type Baz={"a":types.Qux;};
}
"#
);

或者,您可以使用write_definition_file_from_type_infos,并使用在运行时创建的TypeInfo引用的列表来创建一个定义文件。例如

use serde::Serialize;
use typescript_type_def::{write_definition_file_from_type_infos, TypeDef};

#[derive(Serialize, TypeDef)]
struct Foo {
    a: String,
}

#[derive(Serialize, TypeDef)]
struct Bar {
    a: String,
}

#[derive(Serialize, TypeDef)]
struct Baz {
    a: Qux,
}

#[derive(Serialize, TypeDef)]
struct Qux {
    a: String,
}

// This list contains type info for all the top-level types we want to make
// definitions for.
// You don't need to list *every* type in your API here, only ones that
// wouldn't be referenced otherwise. Note that `Qux` is not mentioned, but
// is still emitted because it is a dependency of `Baz`.
let api = vec![
    &Foo::INFO,
    &Bar::INFO,
    &Baz::INFO,
];

let ts_module = {
    let mut buf = Vec::new();
    write_definition_file_from_type_infos(
        &mut buf,
        Default::default(),
        &api,
    )
    .unwrap();
    String::from_utf8(buf).unwrap()
};
assert_eq!(
    ts_module,
    r#"// AUTO-GENERATED by typescript-type-def

export default types;
export namespace types{
export type Foo={"a":string;};
export type Bar={"a":string;};
export type Qux={"a":string;};
export type Baz={"a":types.Qux;};
}
"#
);

依赖项

约2MB
约47K SLoC