RN: Class static side 'typeof *' 错误地扩展了 base class static side 'typeof BaseModel

RN: Class static side 'typeof *' incorrectly extends base class static side 'typeof BaseModel

在 React Native 中,我正在扩展一个 ORM class(根据其文档),但我在 VSCode TypeScript 检查器中遇到以下错误:

Class static side 'typeof Animal' incorrectly extends base class static side 'typeof BaseModel'.
  Types of property 'database' are incompatible.
    Type '() => Promise<SQLite.WebSQLDatabase>' is not assignable to type 'void'.ts(2417)

最后它确实起作用了,但我想知道是否有一种方法可以更正确或更宽松地定义它,这样就不会产生这样的检查器错误。
ORM 模块只是 JS(不是 TypeScript)编辑:它是第 3 方,所以我不能真正编辑它

这是BaseModel中的父class方法:

  static get database() {
    throw new Error('DB not defined')
  }

这是Animal模型的扩展方法:

  static get database() {
    return async () => SQLite.openDatabase('database.db')
  }

Typescript 将 BaseModeldatabase getter 推断为 void 类型。这是因为您既没有 return 值,也没有 getter 的显式类型。然后 Animal 尝试扩展它,它 return 是一个异步函数,它不是空的,你会得到类型错误。

此处正确的解决方法是正确键入 BaseModel.database return 值。在这种情况下,我相信它应该 return 一个异步函数,它 return 是一个承诺,它包装了你的数据库对象。

class BaseModel {
  static get database(): () => Promise<MyDb> {
    throw new Error('DB not defined')
  }
}

现在 Animal 没有类型错误:

class Animal extends BaseModel {
  static get database() {
    return async () => SQLite.openDatabase('database.db')
  }
}

您可以获得数据库参考:

const db = await Animal.database()

Playground


如果不同的子类 return 具有不同接口的不同数据库,那么您可以改为让子类定义 return 类型:

class BaseModel {
  static get database(): () => Promise<unknown> { // unknown here
    throw new Error('DB not defined')
  }
}

Playground