如何在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
相关产品推荐
相关产品推荐

