Object.assign()调用出现重载不匹配错误,如何解决?
问题代码
export class Attributes<T> { constructor(private data: T) {} get<K extends keyof T>(key: K): T[K] { return this.data[key]; } set(update: T): void { Object.assign(this.data, update); } }
错误信息
No overload matches this call.
Overload 1 of 4, '(target: {}, source: T): {} & T', gave the following error.
Argument of type 'T' is not assignable to parameter of type '{}'.
Overload 2 of 4, '(target: object, ...sources: any[]): any', gave the following error.
Argument of type 'T' is not assignable to parameter of type 'object'.ts(2769)
Attributes.ts(1, 25): This type parameter might need anextends {}constraint.
Attributes.ts(1, 25): This type parameter might need anextends objectconstraint.
修复方案
给泛型T添加extends object约束,确保T只能是对象类型(包括普通对象、数组等),修改后的代码如下:
export class Attributes<T extends object> { constructor(private data: T) {} get<K extends keyof T>(key: K): T[K] { return this.data[key]; } set(update: T): void { Object.assign(this.data, update); } }
原因说明
Object.assign的第一个参数要求是对象类型,而原始代码中泛型T没有约束,允许传入number、string这类基本类型,此时调用Object.assign会触发类型不匹配错误。添加extends object约束后,限制了T的范围,确保this.data和update都是对象类型,符合Object.assign的参数要求,错误即可解决。
内容的提问来源于stack exchange,提问作者13reath

