如何覆盖使用泛型进行键入的抽象 class 中的方法?
How to override method from abstract class that uses generics for typing?
我的目标是创建一个抽象 class,它有一个抽象静态方法(将来可能会得到一些基本实现),我想在具体 class 中覆盖它。它是一个静态方法,因为它从数据库模型创建一个 'copy' 并解析它以便在前端使用。虽然我可以 return 任何类型,但我想约束打字稿以检查参数和 return 类型是扩展 2 个不同 classes 的对象,这就是为什么我认为泛型是要走的路。因此,以下代码片段举例说明了我想做的事情:
export abstract class WebModel {
public static getWebModelFromDbModel<A extends WebModel, B extends Model>(dBModel: B): A {
throw some error
}
}
export class concreteWebModel extends WebModel {
public static getWebModelFromDbModel(dbModel: classThatExtendsModel): concreteWebModel {
some implementation
}
}
但是,WebStorm 表示 concreteWebModel“错误地扩展了基础 class”。我在这里做错了什么?
根据你的要求,你可以试试
interface Model {}
abstract class WebModel {
public static getWebModelFromDbModel<A extends WebModel, B extends Model>(dBModel: B): A {
throw 'some error'
}
}
class concreteWebModel extends WebModel {
public static getWebModelFromDbModel<A extends WebModel=concreteWebModel>(dbModel: Model): A & concreteWebModel {
return '' as unknown as A&concreteWebModel;
}
log() {}
}
let s = concreteWebModel.getWebModelFromDbModel(1 as any as Model);
s.log()
你也可以删除泛型类型 A
,如果你不想强制转换
interface Model {}
abstract class WebModel {
public static getWebModelFromDbModel<B extends Model>(dBModel: B): WebModel {
throw 'some error'
}
}
class concreteWebModel extends WebModel {
public static getWebModelFromDbModel<B extends Model>(dBModel: B): concreteWebModel {
return new concreteWebModel();
}
log() {}
}
let s = concreteWebModel.getWebModelFromDbModel(1 as any as Model);
s.log()
我的目标是创建一个抽象 class,它有一个抽象静态方法(将来可能会得到一些基本实现),我想在具体 class 中覆盖它。它是一个静态方法,因为它从数据库模型创建一个 'copy' 并解析它以便在前端使用。虽然我可以 return 任何类型,但我想约束打字稿以检查参数和 return 类型是扩展 2 个不同 classes 的对象,这就是为什么我认为泛型是要走的路。因此,以下代码片段举例说明了我想做的事情:
export abstract class WebModel {
public static getWebModelFromDbModel<A extends WebModel, B extends Model>(dBModel: B): A {
throw some error
}
}
export class concreteWebModel extends WebModel {
public static getWebModelFromDbModel(dbModel: classThatExtendsModel): concreteWebModel {
some implementation
}
}
但是,WebStorm 表示 concreteWebModel“错误地扩展了基础 class”。我在这里做错了什么?
根据你的要求,你可以试试
interface Model {}
abstract class WebModel {
public static getWebModelFromDbModel<A extends WebModel, B extends Model>(dBModel: B): A {
throw 'some error'
}
}
class concreteWebModel extends WebModel {
public static getWebModelFromDbModel<A extends WebModel=concreteWebModel>(dbModel: Model): A & concreteWebModel {
return '' as unknown as A&concreteWebModel;
}
log() {}
}
let s = concreteWebModel.getWebModelFromDbModel(1 as any as Model);
s.log()
你也可以删除泛型类型 A
,如果你不想强制转换
interface Model {}
abstract class WebModel {
public static getWebModelFromDbModel<B extends Model>(dBModel: B): WebModel {
throw 'some error'
}
}
class concreteWebModel extends WebModel {
public static getWebModelFromDbModel<B extends Model>(dBModel: B): concreteWebModel {
return new concreteWebModel();
}
log() {}
}
let s = concreteWebModel.getWebModelFromDbModel(1 as any as Model);
s.log()