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

