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日 |
#137 在 Web编程 类别中
2,497 每月下载量
在 7 个 包中使用(直接使用4个)
77KB
1K SLoC
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