如何覆盖使用泛型进行键入的抽象 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()