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

TypeScript纯类型层面如何遍历字典类型批量转换属性值?

实现方案说明

这个需求完全可以在TypeScript纯类型层面实现,核心依靠TypeScript原生的映射类型能力完成逐属性遍历转换,完全不需要手动逐属性编写逻辑,适配动态生成属性的业务场景。

核心实现逻辑

你伪代码中"遍历对象每个属性、逐属性做类型转换"的需求,TypeScript有成熟的标准语法支持:

  • 通过keyof T获取输入对象类型的所有已知属性键
  • 通过[K in keyof T]遍历每一个属性键
  • 对每个键对应的原始属性值,调用你已经实现的GetClassParameterForAlphaBeta工具类型完成泛型参数提取
    转换结果会完全保留原对象的属性结构、可选/只读修饰符,和手写逐属性定义的类型精度完全一致。

修正后的完整代码

你之前定义的Store类型带有字符串索引签名,会抹平原有对象的精确属性信息,建议调整约束后实现,兼容动态生成的属性结构:

class Alpha<T> {
    private a: T;
}

class Beta<T> {
    private b: T;
}

// 保留你已实现的泛型参数提取逻辑
type GetClassParameterForAlphaBeta<T extends Alpha<any> | Beta<any>> =
    T extends Alpha<infer R>
    ? R : T extends Beta<infer R>
    ? R : unknown;

// 替换伪代码的正式类型实现
type GetStoreData<T> = {
    [K in keyof T]: T[K] extends Alpha<any> | Beta<any> 
        ? GetClassParameterForAlphaBeta<T[K]> 
        : T[K]
};

type Data = {a: Alpha<number>; b: Beta<string>; c: Alpha<string> };

type x = GetStoreData<Data> 
// 推导结果完全匹配预期:{a: number; b: string; c: string}

细节说明

  • 所有转换逻辑完全运行在纯类型层面,没有任何运行时代码开销
  • 自动适配动态生成的属性结构,无论输入的对象类型有多少个确定的有限属性,都能自动完成逐属性转换,不需要维护额外的属性列表
  • 自动保留原属性的修饰特征:如果原属性是可选的、只读的,转换后的类型会完整保留这些修饰,不会出现类型精度丢失
  • 加入的属性类型判断逻辑可以避免非Alpha/Beta类型的属性触发编译报错,适配更通用的业务场景

内容的提问来源于stack exchange,提问作者Maciej Kravchyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 02:54:04