如何在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
相关产品推荐
相关产品推荐

