Typescript中如何将Record的所有值转换为新的Record对象
TypeScript 动态转换Record类型实现方案
无需提前感知传入Record的键名,只需遍历所有键值对做值转换后生成新对象即可,以下是两种可行实现:
方案1:基于Object.fromEntries(现代TS/JS环境推荐)
function numberToString<Keys extends string>(record: Record<Keys, number>): Record<Keys, string> { return Object.fromEntries( Object.entries(record).map(([key, value]) => [key, value.toString()]) ) as Record<Keys, string>; }
实现逻辑说明:
Object.entries(record)会将输入的Record对象转换为[键, 值]格式的二维数组,自动枚举所有自有键- 遍历二维数组,将数值类型的value调用
toString()方法转为字符串格式 Object.fromEntries()将处理完成的二维数组重新拼装为对象- 末尾的类型断言用于对齐Object.entries默认返回的string类型键和泛型Keys的类型,保证类型安全
方案2:基于for in遍历(兼容性更好)
适配不支持Object.fromEntries的低版本运行环境:
function numberToString<Keys extends string>(record: Record<Keys, number>): Record<Keys, string> { const result = {} as Record<Keys, string>; for (const key in record) { if (Object.prototype.hasOwnProperty.call(record, key)) { result[key] = record[key].toString(); } } return result; }
实现逻辑说明:
- 提前初始化符合返回类型的空对象
- 遍历输入Record的所有键,通过
hasOwnProperty过滤原型链上的异常属性 - 逐个将转换后的键值对写入空对象后返回
调用验证
使用示例代码调用可得到预期结果:
const record: Record<"A" | "B", number> = { "A": 10, "B": 20 }; const record2 = numberToString(record); // record2 类型为 Record<"A" | "B", string>,实际值为 { A: "10", B: "20" }
内容的提问来源于stack exchange,提问作者Storm 7953
相关产品推荐
相关产品推荐

