如何实现为对象属性名拼接前缀的泛型map函数
TypeScript 泛型实现:为对象所有属性名添加指定前缀
实现思路
- 类型层面用 TypeScript 映射类型实现返回值的自动推导,保证新对象的键名、值类型和原对象强关联,不会丢失类型提示
- 运行时遍历原对象的可枚举自有属性,拼接前缀生成新键名,属性值保持不变后返回新对象
完整实现代码
现代环境版本(支持Object.fromEntries)
function addPrefixToObjectKeys<T extends Record<string, any>, P extends string>( obj: T, prefix: P ): { [K in keyof T as `${P}${string & K}`]: T[K] } { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [`${prefix}${key}`, value]) ) as { [K in keyof T as `${P}${string & K}`]: T[K] }; }
低版本兼容版本(兼容ES5及以上)
function addPrefixToObjectKeys<T extends Record<string, any>, P extends string>( obj: T, prefix: P ): { [K in keyof T as `${P}${string & K}`]: T[K] } { const result = {} as { [K in keyof T as `${P}${string & K}`]: T[K] }; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result[`${prefix}${key}` as keyof typeof result] = obj[key]; } } return result; }
如果只需要纯JavaScript版本,去掉泛型和类型标注即可直接使用。
使用示例
const originalObj = { name: "张三", age: 25, isAdmin: true }; const prefixedObj = addPrefixToObjectKeys(originalObj, "user_"); // 新对象自动推导类型为:{ user_name: string; user_age: number; user_isAdmin: boolean } console.log(prefixedObj.user_name); // 输出:张三 console.log(prefixedObj.user_age); // 输出:25
内容的提问来源于stack exchange,提问作者samadadi
相关产品推荐
相关产品推荐

