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 将 BaseModel
的 database
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()
如果不同的子类 return 具有不同接口的不同数据库,那么您可以改为让子类定义 return 类型:
class BaseModel {
static get database(): () => Promise<unknown> { // unknown here
throw new Error('DB not defined')
}
}
在 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 将 BaseModel
的 database
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()
如果不同的子类 return 具有不同接口的不同数据库,那么您可以改为让子类定义 return 类型:
class BaseModel {
static get database(): () => Promise<unknown> { // unknown here
throw new Error('DB not defined')
}
}