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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:06:20