首页
/ ts-rs v11.0.0发布:更强大的Rust到TypeScript类型转换工具

ts-rs v11.0.0发布:更强大的Rust到TypeScript类型转换工具

2025-07-02 20:20:58作者:苗圣禹Peter

ts-rs是一个优秀的Rust库,它能够自动将Rust类型转换为TypeScript类型定义,极大地简化了前后端类型同步的工作。这个工具特别适合全栈开发场景,让开发者可以保持前后端类型系统的一致性,减少手动维护类型定义的工作量。

主要更新内容

1. 可选字段的批量声明

新版本引入了#[ts(optional_fields)]属性,这是一个非常实用的功能。在之前的版本中,如果我们需要将一个结构体的所有字段都声明为可选,需要为每个字段单独添加#[ts(optional)]属性。现在,只需要在结构体级别添加#[ts(optional_fields)]就能实现同样的效果。

#[derive(TS)]
#[ts(optional_fields)]
struct Form {
  first_name: Option<String>,  // 生成 first_name?: string
  last_name: Option<String>,   // 生成 last_name?: string
  email: Option<String>,       // 生成 email?: string
}

这个特性特别适合处理表单数据或API请求体这类场景,其中很多字段都是可选的。

2. 增强的serde兼容性

ts-rs现在更好地与serde序列化库集成。当字段同时使用#[serde(skip_serializing_if)]#[serde(default)]属性时,ts-rs会自动将这些字段转换为TypeScript中的可选属性。

#[derive(Serialize, Deserialize, TS)]
struct User {
  #[serde(skip_serializing_if = "Option::is_none", default)]
  nickname: Option<String>,  // 生成 nickname?: string | null
}

这种改进确保了生成的TypeScript类型既能正确反映序列化行为,也能匹配反序列化需求,减少了类型不匹配的问题。

3. 更灵活的属性表达式

新版本允许在多个属性中使用任意Rust表达式,这为类型定义带来了更大的灵活性:

// 使用模块路径作为类型名称
#[derive(TS)]
#[ts(rename = module_path!().rsplit_once("::").unwrap().1)] 
struct Model;

// 在文档注释中包含文件路径信息
#[derive(TS)]
#[doc = concat!("定义于 ", file!())]
struct UserGroup;

这个特性特别适合大型项目或代码生成场景,可以实现更动态的类型定义方式。

4. 元组结构体的可选字段

现在可以在元组结构体中使用#[ts(optional)]属性标记可选字段:

#[derive(TS)]
struct Location(Country, State, #[ts(optional)] City);  // 生成 [Country, State, City?]

这使得元组结构体的类型转换更加灵活,能够更好地表达各种数据结构。

升级注意事项

从v10升级到v11时需要注意以下几点:

  1. 当同时使用#[serde(skip_serializing(_if))]#[serde(default)]时,字段现在会被转换为可选属性。如果不需要这种行为,可以使用#[ts(optional = false)]显式禁用。

  2. ts_rs::TS trait的API有微小调整,大多数用户不会受到影响,但如果直接与这个trait交互,可能需要做少量调整。

技术实现亮点

  1. 更智能的serde属性处理:通过分析serde属性组合,自动推断出最合适的TypeScript类型表示。

  2. 表达式支持:利用Rust的宏系统,实现了对任意表达式的解析和求值,大大增强了属性的表达能力。

  3. 类型系统改进:优化了内部类型表示,使得可选类型的处理更加一致和可靠。

适用场景

ts-rs v11.0.0特别适合以下场景:

  1. 全栈TypeScript项目:保持前后端类型定义完全同步。

  2. API文档生成:结合Swagger或其他文档工具,自动生成准确的类型定义。

  3. 大型项目维护:减少手动维护类型定义的工作量,提高开发效率。

  4. 动态类型需求:利用新的表达式支持,实现更灵活的类型生成逻辑。

这个版本的发布标志着ts-rs在Rust和TypeScript互操作领域又迈出了重要一步,为开发者提供了更强大、更灵活的类型转换能力。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
260
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
854
505
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
254
295
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
331
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
397
370
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
21
5