TypeScript 4.9下如何重构copyIfAccepted方法实现单次批量属性复制?
问题描述
我们定义了如下User接口:
interface User { Id: number; FirstName: string; Lastname: string; Age: number; Type: string; }
同时存在一个基于布尔标志复制对象属性的方法:
function copyIfAccepted<T extends object, K extends keyof T>(source: T, dest: T, key: K, isAccepted: boolean) { if (isAccepted && source[key] !== dest[key]) { dest[key] = source[key]; } }
目前需要针对每个属性多次调用该方法,示例如下(属性列表并不完整):
copyIfAccepted(oldUser, newUser, 'Id', true); copyIfAccepted(oldUser, newUser, 'FirstName', false); copyIfAccepted(oldUser, newUser, 'LastName', true); copyIfAccepted(oldUser, newUser, 'Age', true);
现在需要在TypeScript 4.9环境下重构该方法,使其能通过单次调用处理所有相关属性,该如何实现?
解决方案
可以重构出一个新函数,接收属性-允许复制标志的映射对象,一次性遍历处理所有需要控制的属性:
function copyMultipleIfAccepted<T extends object>( source: T, dest: T, acceptMap: Partial<Record<keyof T, boolean>> ) { for (const key of Object.keys(acceptMap) as Array<keyof T>) { const isAccepted = acceptMap[key]; if (isAccepted && source[key] !== dest[key]) { dest[key] = source[key]; } } }
调用示例
针对原有的调用场景,现在只需单次调用即可:
copyMultipleIfAccepted(oldUser, newUser, { Id: true, FirstName: false, LastName: true, Age: true });
核心细节说明
- 用
Partial<Record<keyof T, boolean>>约束acceptMap的类型:既保证键只能是目标对象T的属性,又允许只传入需要控制的部分属性(无需处理的属性可省略) - 通过
Object.keys(acceptMap) as Array<keyof T>做类型断言,确保遍历的键符合T的属性类型要求 - 保留原方法的核心逻辑:仅当允许复制且源、目标属性值不同时,才执行复制操作
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

