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

TypeScript:基于构造函数参数扩展this类型的问题

解决TypeScript类中Object.assign扩展this的类型识别问题

你遇到的问题是TypeScript无法识别通过Object.assign添加到类实例上的外部属性——默认情况下泛型类Baz<T>的实例类型只包含类自身声明的属性,不会自动合并泛型T的属性。以下是两种可行的解决方案:

方案一:修改构造函数返回类型

通过指定构造函数的返回值为this & T(类自身实例与泛型T的交叉类型),让TypeScript自动识别合并后的属性:

class Baz<T extends object> {
    public test?: unknown; // 为test指定明确类型,避免隐含的any类型
    constructor(props: T): this & T {
        Object.assign(this, props);
        return this as this & T;
    }
}

interface IFoo {
  foo: number;
}

const p = new Baz<IFoo>({foo: 1});
p.test; // 正常识别类自身属性
p.foo; // 现在能正确识别传入的外部属性

方案二:定义交叉类型并断言

如果不想修改构造函数,可以单独定义一个包含类实例和泛型属性的交叉类型,创建实例时手动断言:

class Baz<T extends object> {
    public test?: unknown;
    constructor(props: T) {
        Object.assign(this, props);
    }
}

// 定义交叉类型,合并类实例与泛型属性
type BazInstance<T extends object> = Baz<T> & T;

interface IFoo {
  foo: number;
}

const p = new Baz<IFoo>({foo: 1}) as BazInstance<IFoo>;
p.test;
p.foo; // 正确识别传入的外部属性

两种方案都能让TypeScript正确识别通过Object.assign添加的外部属性,方案一更自动化,无需额外断言操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:15:38