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

如何在TypeScript中实现类型安全的浅拷贝,解决TS2322类型报错?

TypeScript浅拷贝类型错误修复方案

错误原因

TS2322错误属于合理的类型校验提示:泛型T未做任何类型约束,可以被实例化为任意类型(比如字符串、数字、null、数组等),直接将空对象{}赋值给T类型的变量,自然会出现类型不兼容的问题。

修复实现

手动循环实现版本

const shallowCopy = <T>(obj: T): T => {
  // 处理原始值、null、undefined,浅拷贝直接返回本身即可
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  // 根据入参类型初始化对应结构,用类型断言告诉TS此处类型匹配(逻辑已经保证安全)
  const newObj = Array.isArray(obj) ? [] as T : {} as T;
  const objKeys = Object.keys(obj) as (keyof T)[];

  for (const k of objKeys) {
    newObj[k] = obj[k];
  }

  return newObj;
}

更简洁的展开运算符版本

展开运算符的实现TS本身可以自动推导类型,无需额外的复杂类型处理,代码更精简:

const shallowCopy = <T>(obj: T): T => {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  if (Array.isArray(obj)) {
    return [...obj] as T;
  }
  return { ...obj } as T;
}

关键说明

  • 给泛型增加前置类型判断,覆盖所有可能的输入类型,避免初始化结构和实际类型不匹配的问题
  • 此处的as T类型断言是安全的:我们已经提前判断了入参的类型,保证初始化的新对象结构和入参完全匹配,不会出现类型错误
  • 如果仅需要处理普通对象,可以给泛型增加约束T extends Record<string, any>,进一步收窄类型范围,降低类型断言的使用风险

内容的提问来源于stack exchange,提问作者eczn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:12:00