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”]
它也不起作用
有人能解释一下原因吗?我应该采取什么不同的措施,以便我们可以在
工厂
类的函数签名中别名typeT[“prototype”]
?通常,当您遇到此错误时,您使用了太多的通用参数。您不需要仅从另一个泛型参数派生的泛型参数
M
中的M extensed BaseModel=T[“prototype”]
与T[“prototype”]
不同。如果一个接口扩展了另一个接口,这意味着它符合该接口的约定,但它也可能有其他字段。Typescript不相信它可以保证它可以使用t
创建M
,因为t
只能保证是M
的子集,而不是整个M
删除泛型参数会修复它,因为没有扩展任何其他内容。您正在实例化的类与T['prototype']
完全匹配,因为它们都是直接从T
派生的,并且在本例中,它们都不只是扩展T
——难道没有办法使人们不必键入T[“prototype”]
?