XXX类型不可分配给'类型;T';在typescript中使用泛型时

XXX类型不可分配给'类型;T';在typescript中使用泛型时,typescript,Typescript,我想创建一个可以在子类中引用的静态函数。BaseClass的示例如下 export abstract class BaseEntity { public static of<T>(params: Partial<T>, type: new () => T): T { const item = new type(); Object.assign(type, params); return item;

我想创建一个可以在子类中引用的静态函数。
BaseClass
的示例如下

export abstract class BaseEntity {
    public static of<T>(params: Partial<T>, type: new () => T): T {
        const item = new type();

        Object.assign(type, params);

        return item;
    }
}
导出抽象类BaseEntity{
公共静态(参数:Partial,类型:new()=>T):T{
const item=新类型();
Object.assign(类型、参数);
退货项目;
}
}
然后我用下面的用户类扩展了BaseEntity

export class User extends BaseEntity{
    public static of(params: Partial<User>): User {
        return super.of<User>(params, User);
    }
}
导出类用户扩展BaseEntity{
公共静态(参数:部分):用户{
返回super.of(参数、用户);
}
}
对于我来说,这似乎是一个合法的代码,因为我将用户作为泛型类型提供,并且我已经显式地编码BaseEntity静态函数应该返回相同类型的函数(不会抛出错误)。但是,编写此代码会产生以下错误

TS2417:类静态端“用户类型”错误地扩展了基类 静态端“基本实体的类型”。“of(…)”返回的类型 这些类型之间不兼容。类型“User”不可分配给 键入“T”T'可以用任意类型实例化,该类型可以 与“用户”无关


似乎是说类型User不能返回,因为父类返回的类型T与用户类型不兼容。这对我来说毫无意义,因为我显式地向泛型类型提供T应该是User。我做错了什么?如何克服这个问题?

Hmmm。您是否试图覆盖这里的静态方法?那恐怕不行静态方法绑定到类的构造函数而不是其原型。您只能在类本身上调用它们,而不能在类的实例上调用它们。因此,您的
BaseEntity.of()
方法和
User.of()
方法实际上是两个完全不相关的函数

您的
BaseEntity.of()
方法似乎是实体的工厂方法。也许您可以考虑使用<代码>基本实体。()<代码>方法,并删除<代码>用户>()<代码>方法。下面的示例代码仅在
BaseEntity
类中创建静态
of()
方法,并将其用于初始化两个
User
变量。(出于演示目的,我还向
User
类添加了
name
属性。)

不过,还有一些补充意见:

  • 交换
    of()
    函数的参数可能很有用:首先是
    类型
    参数(应始终提供),其次是
    参数
    参数(如果您想创建默认实例,可以选择该参数)
  • 我注意到在
    BaseEntity.of()
    方法中,您将
    params
    对象的内容分配给
    type
    ,但我假设您希望将它们分配给
BaseEntity.ts

导出抽象类BaseEntity{
静态(类型:new()=>T,参数?:Partial){
const item=新类型();
分配对象(项、参数);
退货项目;
}
//...
}
User.ts

从'BaseEntity'导入{BaseEntity};
导出类用户扩展BaseEntity{
名称?:字符串;
}
main.ts

从'BaseEntity'导入{BaseEntity};
从“用户”导入{User};
constuser1=BaseEntity.of(用户,{name:'johndoe'});
const user2=BaseEntity.of(用户);
console.log(user1.name);//无名氏
console.log(user2.name);//未定义
我假设您的
BaseEntity
类包含额外的(与基本实体相关的)逻辑。但如果不是这样,您可能希望从
BaseEntity
类中提取实体创建逻辑,并将其放在“全局”工厂函数中。执行此操作时,可以完全删除
BaseEntity
类。因此,您的具体实体类将少一个依赖项

createEntity.ts

导出函数createEntity(类型:new()=>T,参数?:Partial){ const item=新类型(); 分配对象(项、参数); 退货项目; }
User.ts

导出类用户{
名称?:字符串;
}
main.ts

从“createEntity”导入{createEntity};
从“用户”导入{User};
const user1=createEntity(用户,{name:'John Doe'});
const user2=createEntity(用户);
console.log(user1.name);//无名氏
console.log(user2.name);//未定义

完美。正是我要找的。