Typescript类型约束不一致



我收到错误"可以用不同的约束子类型"来实例化;当我有这样的代码时:

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();

然而,如果我将其更改为以下内容,我不会出错:

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();

如果我使用InstanceType<T>而不是T["prototype"],它也不起作用。

有人能解释一下原因吗?我应该做些什么不同的操作,以便我们可以在Factory类的函数签名中别名类型T["prototype"]

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

CCD_ 6中的CCD_ 5与CCD_。如果一个接口extends是另一个接口,这意味着它符合该接口的合同,但它也可能有其他字段。Typescript不相信它可以保证它可以使用T来创建M,因为T只保证是M的子集,而不是整个M

删除泛型参数可以修复它,因为没有任何东西可以扩展其他任何东西。您正在实例化的类与T['prototype']完全匹配,因为它们都是直接从T派生的,而不仅仅是extends T

最新更新