Typescript 类型脚本类型约束不一致

Typescript 类型脚本类型约束不一致,typescript,generics,types,Typescript,Generics,Types,当我有这样的代码时,我得到一个错误“可以用不同的约束子类型实例化”: class BaseModel { hello() { return "HELLO"; } static yada() { return "YADA"; } } class OtherModel extends BaseModel { hola() { return "HOLA" } } class Factory<

当我有这样的代码时,我得到一个错误“可以用不同的约束子类型实例化”:

class BaseModel {
  hello() {
    return "HELLO";
  }
  static yada() {
    return "YADA";
  }
}

class OtherModel extends BaseModel {
  hola() { return "HOLA" }
}

class Factory<
  T extends typeof BaseModel,
  M extends BaseModel = T["prototype"]
> {
  private _modelClass: T;
  constructor(modelClass: T) {
    this._modelClass = modelClass;
  }
  build(): M {
    return new this._modelClass();
  }
  echoClassMethod() {
    console.log(this._modelClass.prototype.hello);
  }
}

new Factory(OtherModel).build();
类基本模型{
你好(){
回复“你好”;
}
静态yada(){
返回“YADA”;
}
}
类OtherModel扩展了BaseModel{
hola(){返回“hola”}
}
阶级工厂<
T扩展了BaseModel的类型,
M扩展基本模型=T[“原型”]
> {
私有模型类:T;
构造函数(模型类:T){
这个._modelClass=modelClass;
}
build():M{
返回新的此参数。_modelClass();
}
echoClassMethod(){
log(this.\u modelClass.prototype.hello);
}
}
新工厂(其他型号).build();
但是,如果将其更改为以下内容,则不会出现错误:

class Factory<
  T extends typeof BaseModel
> {
  private _modelClass: T;
  constructor(modelClass: T) {
    this._modelClass = modelClass;
  }
  build(): T["prototype"] {
    return new this._modelClass();
  }
  echoClassMethod() {
    console.log(this._modelClass.yada);
  }
}
// The following now gets the correct Intellisense for OtherModel.
new Factory(OtherModel).build();
类工厂<
T扩展了BaseModel的类型
> {
私有模型类:T;
构造函数(模型类:T){
这个._modelClass=modelClass;
}
build():T[“prototype”]{
返回新的此参数。_modelClass();
}
echoClassMethod(){
log(this.\u modelClass.yada);
}
}
//以下内容现在为OtherModel获得了正确的Intellisense。
新工厂(其他型号).build();
如果我使用
InstanceType
而不是
T[“prototype”]
它也不起作用


有人能解释一下原因吗?我应该采取什么不同的措施,以便我们可以在
工厂
类的函数签名中别名type
T[“prototype”]

通常,当您遇到此错误时,您使用了太多的通用参数。您不需要仅从另一个泛型参数派生的泛型参数

M
中的
M extensed BaseModel=T[“prototype”]
T[“prototype”]
不同。如果一个接口
扩展了另一个接口,这意味着它符合该接口的约定,但它也可能有其他字段。Typescript不相信它可以保证它可以使用
t
创建
M
,因为
t
只能保证是
M
的子集,而不是整个
M


删除泛型参数会修复它,因为没有扩展任何其他内容。您正在实例化的类与
T['prototype']
完全匹配,因为它们都是直接从
T
派生的,并且在本例中,它们都不只是
扩展T

——难道没有办法使人们不必键入
T[“prototype”]