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

如何在TypeScript中映射值?实现对象值转Container类型的泛型函数问题

解决TypeScript对象属性类型统一包裹问题

要实现把对象每个属性值都包装成Container类型且保留原类型信息,你需要用TypeScript映射类型,而不是Record工具类型。Record只能给所有属性设置统一值类型,会丢失原属性的具体类型上下文,映射类型则能遍历每个属性单独处理。

完整实现代码

// 先定义Container类型(根据你的实际需求调整结构)
type Container<V> = {
  value: V;
};

// 定义映射类型,把输入对象的每个属性值都包裹成Container
type EnrichedObject<T> = {
  [K in keyof T]: Container<T[K]>;
};

// 实现enrich函数
function enrich<T extends object>(value: T): EnrichedObject<T> {
  const result = {} as EnrichedObject<T>;
  
  // 遍历原对象的所有键,逐个包装值
  for (const key in value) {
    if (Object.prototype.hasOwnProperty.call(value, key)) {
      result[key] = { value: value[key] } as Container<T[typeof key]>;
    }
  }
  
  return result;
}

效果验证

  • 输入类型{ a: string, c: number },返回类型会自动推导为{ a: Container<string>, c: Container<number> }
  • 输入类型{ a: boolean, b: Cow },返回类型为{ a: Container<boolean>, b: Container<Cow> }

为什么之前的Record不行?

你之前用的Record<T, Container<any>>是错误用法(Record的第一个参数应该是键的联合类型,不是整个对象类型),就算改成Record<keyof T, Container<any>>,也会把所有属性值都设为Container<any>,丢失了原属性的具体类型(比如string、boolean这些)。而映射类型[K in keyof T]: Container<T[K]>会为每个属性K单独取原类型T[K],再包裹成对应的Container类型,完美保留类型信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:29:53