TypeScript实现ProcedureCode数组到ProcedureView数组的复制方法
TypeScript 跨类型数组复制最简实现
直接使用数组map方法配合对象展开运算符(Spread Operator)即可完成需求,无需手动遍历逐个赋值共有属性,TypeScript 可自动完成类型校验。
核心实现代码
假设存储ProcedureCode类型的源数组名为procedureCodeList:
const procedureViewList: ProcedureView[] = procedureCodeList.map(item => ({ ...item, inventory: null, itemDescription: null }));
类型兼容处理
如果项目开启了strictNullChecks严格空值校验,直接给number/string类型属性赋值null会抛出类型错误,推荐优先调整ProcedureView类型定义,匹配临时赋值null的实际运行状态:
export type ProcedureView = ProcedureCode & { inventory: number | null; itemDescription: string | null; };
如果不想修改原类型定义,也可以通过类型断言临时绕过校验(不推荐,会丢失部分类型安全性):
const procedureViewList: ProcedureView[] = procedureCodeList.map(item => ({ ...item, inventory: null as unknown as number, itemDescription: null as unknown as string }));
方案优势
- 展开运算符
...item会自动浅拷贝ProcedureCode的所有自有属性,后续ProcedureCode新增/删除共有属性时,转换逻辑不需要同步修改,维护成本极低 - 转换全程生成全新的数组和对象,不会修改原
ProcedureCode数组内容,无副作用 - 语法简洁,核心转换逻辑仅需3行,可读性强
兼容环境替代写法
如果运行环境不支持对象展开运算符(极低版本JS运行时),可以用Object.assign实现完全一致的效果:
const procedureViewList: ProcedureView[] = procedureCodeList.map(item => Object.assign({}, item, { inventory: null, itemDescription: null }) );
注意:以上实现均为浅拷贝,当前
ProcedureCode的所有属性都是原始值类型,浅拷贝可完全满足需求;如果后续ProcedureCode新增对象、数组类引用类型属性,且需要新旧对象完全独立,需要额外做深拷贝处理。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

