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

Next.js+TypeScript项目泛型递归函数报错:类型'T'无'constructor'属性

解决TypeScript深克隆函数中"Property 'constructor' does not exist on type 'T'"的错误

错误原因在于泛型T没有明确的类型约束,TypeScript无法确定传入的obj一定包含constructor属性——即便你在运行时已经过滤掉了非对象类型,但静态类型检查系统无法感知这一点。

同时原代码存在两个潜在问题:

  1. 调用obj.constructor()时缺少new关键字,对于需要通过new实例化的构造函数会报错
  2. 未专门处理数组类型,虽然循环赋值能生效,但用数组原生方法更直观

下面是修正后的代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:50:24