You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:35:13