首页 > 解决方案 > 子类覆盖基类的返回类型

问题描述

我正在尝试覆盖super类中定义的方法,但是我收到一条错误消息:

'Model' 类型中的属性 'get' 不能分配给基本类型 'DB' 中的相同属性。

我能做些什么来覆盖它?它适用于生成的 JavaScript,我不想让DB.get()returnPromise<any>也有效。

type NonAbstractModel<T extends Model> = (new () => T) & typeof Model
type RowDataPacket = {}

export class Collection<T> {
  protected _items: T[] = []
  public add(item:T){ this._items.push(item) }
}

export class DB {
  public async get(): Promise<RowDataPacket[]> { 
    // Query a database, this is just dummy data
    return [{}, {}, {}]
  }
}

export abstract class Model extends DB {

  public static convert<T extends Model>(model: NonAbstractModel<T>, data: RowDataPacket[]): Collection<T> {
    let c = new Collection<T>()
    for(let i of data) {
      let m = new model()
      c.add(m)
    }
    return c
  }

  public async get<T extends Model>():Promise<Collection<T>>{
    return Model.convert(<NonAbstractModel<T>>this.constructor, await super.get())
  }
}

两者如何工作:

D B

使用 DB 类时,我们不知道 Model 的类型,因为模型基于数据库表,但我们知道结果将是数据库项的数组。

模型

当使用模型时,我们确实知道模型的类型是什么,因此我们能够将数据包数据转换为模型集合(每个行项目一个模型类)。

打字稿游乐场

标签: javascripttypescript

解决方案


推荐阅读