En reaccionar nativo, estoy extendiendo una clase ORM (según su documentación) pero recibo el siguiente error en el verificador 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) Al final realmente funciona, pero me gustaría saber si hay una manera de definirlo más correctamente o más suelto para que no se genere ese error de verificación.
El módulo ORM es solo JS (no TypeScript) EDITAR: y es un tercero, por lo que realmente no puedo editarlo
Este es el método de la clase principal en BaseModel :
static get database() { throw new Error('DB not defined') } Este es el método de extensión del modelo Animal :
static get database() { return async () => SQLite.openDatabase('database.db') }BaseModel infiere que el getter de la base de database de BaseModel es de tipo void . Esto se debe a que no devuelve un valor ni tiene un tipo explícito en ese captador. Entonces Animal intenta extender eso, y devuelve una función asíncrona, que no es nula, y obtienes el tipo de error.
La solución correcta aquí es escribir correctamente el valor de retorno de BaseModel.database . En este caso, creo que debería devolver una función asíncrona, que devuelve una promesa, que envuelve su objeto de base de datos.
class BaseModel { static get database(): () => Promise<MyDb> { throw new Error('DB not defined') } } Ahora Animal funciona sin errores tipográficos:
class Animal extends BaseModel { static get database() { return async () => SQLite.openDatabase('database.db') } }Y puedes obtener una referencia de base de datos:
const db = await Animal.database()Si diferentes subclases devolverían diferentes bases de datos con diferentes interfaces, entonces puede dejar que las subclases definan ese tipo de retorno:
class BaseModel { static get database(): () => Promise<unknown> { // unknown here throw new Error('DB not defined') } }