Rust中能否实现类似TypeScript Pick的匿名结构体字段选择?
Rust 中类似 TypeScript
Pick 的字段选择方案 Rust 是标称类型系统,原生没有 TypeScript 那样基于结构类型的 Pick 语法,但可以通过以下方式实现类似的字段选择并保证类型检查:
原生方案
1. 元组临时承载
直接提取目标字段组成元组,无需额外定义类型:
struct User { id: u32, name: String, age: u8, } let user = User { id: 1, name: "Alice".into(), age: 30 }; let picked = (user.id, user.name); // 类型为 (u32, String)
- 缺点:元组类型无语义,无法与其他同类型元组区分,类型检查粒度较粗。
2. 匿名结构体
Rust 1.55+ 支持匿名结构体语法,可以创建仅包含目标字段的实例:
struct User { id: u32, name: String, age: u8, } let user = User { id: 1, name: "Alice".into(), age: 30 }; let picked = struct { id: u32, name: String } { id: user.id, name: user.name };
- 缺点:匿名结构体的类型无法在函数签名中直接声明,只能通过
impl Trait间接使用,复用性有限。
Crate 方案
使用 pick 宏生成匿名结构体
pick crate 提供的宏可以快速从原结构体中提取指定字段,生成带类型检查的匿名结构体:
use pick::pick; struct User { id: u32, name: String, age: u8, } let user = User { id: 1, name: "Alice".into(), age: 30 }; let picked = pick!(user, id, name); // 可以直接访问 picked.id、picked.name,访问不存在的字段会触发编译错误
这个方案最接近 TypeScript Pick 的体验:无需显式命名新结构体,且能保证类型安全。
使用 derive_more 自动转换为元组
通过 derive_more 的 Into 派生,可以自动实现结构体到指定元组的转换:
use derive_more::Into; #[derive(Into)] #[into(tuple)] struct User { id: u32, name: String, age: u8, } let user = User { id: 1, name: "Alice".into(), age: 30 }; let (id, name): (u32, String) = user.into();
- 优点:无需手动提取字段;缺点:依然依赖元组的无语义类型。
内容的提问来源于stack exchange,提问作者meclondrej
相关产品推荐
相关产品推荐

