4 个版本
0.0.4 | 2024 年 7 月 30 日 |
---|---|
0.0.3 | 2024 年 6 月 16 日 |
0.0.2 | 2021 年 11 月 26 日 |
0.0.1 | 2021 年 11 月 26 日 |
在 开发工具 中排名第 489
每月下载量 2,660 次
46KB
828 行(不包括注释)
实用类型
此软件包使用过程宏在 Rust 中实现 TypeScript 的几个实用类型。
宏 | Typescript 实用类型 |
---|---|
[Partial] | Partial<Type> |
[Pick] | Pick<Type, Keys> |
[Omit] | Omit<Type, Keys> |
[Extract] | Extract<Type, Union> |
[Exclude] | Exclude<UnionType, ExcludedMembers> |
示例
以下是如何使用此软件包的示例。
use utility_types::{Omit, Partial, Pick, Required};
#[derive(Clone, Partial, Required, Pick, Omit)]
#[partial(ident = PartialFoo, derive(Debug, PartialEq), forward_attrs())]
#[required(ident = RequiredFoo, derive(Debug, PartialEq), forward_attrs())]
#[pick(arg(ident = PickAB, fields(a, b), derive(Debug, PartialEq)), forward_attrs())]
#[omit(arg(ident = OmitCD, fields(c, d), derive(Debug, PartialEq)), forward_attrs())]
pub struct Foo {
a: u8,
b: Option<u8>,
c: Option<Vec<u8>>,
}
上述代码将生成以下代码。
#[derive(Debug, PartialEq)]
pub struct PartialFoo {
a: Option<u8>,
b: Option<Option<u8>>,
c: Option<Option<Vec<u8>>>,
}
#[derive(Debug, PartialEq)]
pub struct RequiredFoo {
a: u8,
b: u8,
c: Vec<u8>,
}
#[derive(Debug, PartialEq)]
pub struct PickAB {
a: u8,
b: Option<u8>,
}
#[derive(Debug, PartialEq)]
pub struct OmitCD {
a: u8,
b: Option<u8>,
}
还生成了一些有用的特质。
From<Foo>
为PartialFoo
、PickAB
、OmitCD
From<PartialFoo>
为Foo
转发属性
要与其他需要属性的软件包一起使用此软件包,可以使用 forward_attrs
属性来控制将哪些属性转发到生成的结构体或枚举。
use serde::{Deserialize, Serialize};
use utility_types::Omit;
#[derive(Debug, PartialEq, Serialize, Deserialize, Omit)]
#[omit(
arg(
ident = OmitCD,
fields(c, d),
derive(Debug, PartialEq, Serialize, Deserialize),
forward_attrs(serde)
)
)]
#[serde(rename_all = "UPPERCASE")]
pub struct Foo {
a: u8,
b: Option<u8>,
c: Option<Vec<u8>>,
}
let omit_cd: OmitCD = serde_json::from_str(r#"{"A": 1, "B": 2}"#).unwrap();
assert_eq!(omit_cd, OmitCD { a: 1, b: Some(2) });
forward_attrs
属性的行为如下
- 如果 未提供,则默认转发所有属性。
- 如果提供了一组属性列表,则仅转发指定的属性。
- 例如,
forward_attrs(doc, serde)
将仅转发doc
和serde
。 - 如果提供 仅
*
(forward_attrs(*)
),则转发所有属性。 - 如果提供的是一个空列表(
forward_attrs()
),则不会转发任何属性。
- 例如,
- 如果提供一个列表作为
not()
的参数,则除了指定的属性外,其他所有属性都会被转发。- 例如,
forward_attrs(not(serde))
将转发除了serde
之外的所有属性。
- 例如,
已知问题
目前我没有分析生成的结构体或枚举中使用了哪个泛型。因此,如果泛型字段未包含在生成的结构体或枚举中,rustc 将会报错。
依赖项
~0.6–1MB
~24K SLoC