Next.js+TypeScript项目泛型递归函数报错:类型'T'无'constructor'属性
解决TypeScript深克隆函数中"Property 'constructor' does not exist on type 'T'"的错误
错误原因在于泛型T没有明确的类型约束,TypeScript无法确定传入的obj一定包含constructor属性——即便你在运行时已经过滤掉了非对象类型,但静态类型检查系统无法感知这一点。
同时原代码存在两个潜在问题:
- 调用
obj.constructor()时缺少new关键字,对于需要通过new实例化的构造函数会报错 - 未专门处理数组类型,虽然循环赋值能生效,但用数组原生方法更直观
下面是修正后的代码:
export const deepClone = <T>(obj: T): T => { // 处理基本类型和null if (obj === null || typeof obj !== 'object') { return obj; } let temp: T; // 处理Date对象 if (obj instanceof Date) { temp = new Date(obj) as unknown as T; } // 处理数组类型 else if (Array.isArray(obj)) { temp = [] as unknown as T; obj.forEach((item, index) => { temp[index] = deepClone(item); }); return temp; } // 处理普通对象 else { // 创建继承原对象原型的新对象,避免直接调用构造函数可能带来的参数问题 temp = Object.create(Object.getPrototypeOf(obj)) as T; // 遍历并克隆自身属性 for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { temp[key] = deepClone(obj[key]); } } } return temp; };
关键修改点:
- 用
Object.create(Object.getPrototypeOf(obj))替代直接调用constructor,更安全地继承原对象的原型链,避免自定义构造函数需要参数的问题 - 新增数组类型的专门处理,逻辑更清晰
- 通过
as unknown as T做类型断言,告诉TypeScript我们确认类型匹配 - 补全
new关键字(在Date的处理中)
内容的提问来源于stack exchange,提问作者Ali Ehyaie
相关产品推荐
相关产品推荐

