javascript - RN: Klassens statiska sida 'typeof *' utökar felaktigt basklassens statiska sida 'typeof BaseModel'
I React Native utökar jag en ORM-klass (enligt dess dokumentation) men jag får följande fel i VSCode TypeScript-kontroll:
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)
I slutändan fungerar det faktiskt, men jag skulle vilja veta om det finns ett sätt att definiera det mer korrekt eller mer löst så att ett sådant kontrollfel inte genereras.
ORM-modulen är bara JS (inte TypeScript) REDIGERA: och det är tredjepart, så jag kan egentligen inte redigera det
Detta är föräldraklassens metod i BaseModel:
static get database() {
throw new Error('DB not defined')
}
Detta är den utvidgande metoden av Animal-modellen:
static get database() {
return async () => SQLite.openDatabase('database.db')
}
Svar #1
Typescript härleder BaseModel's database getter till typen void. Detta beror på att du varken returnerar ett värde eller har en explicit typ på den gettern. Sedan försöker Animal att utöka den, och den returnerar en asynkron funktion, vilket inte är void, och du får typfelet.
Den korrekta lösningen här är att korrekt typa BaseModel.database returvärde. I detta fall tror jag att det bör returnera en asynkron funktion, som returnerar ett löfte, som omsluter ditt databasobjekt.
class BaseModel {
static get database(): () => Promise<MyDb> {
throw new Error('DB not defined')
}
}
Nu fungerar Animal utan typfel:
class Animal extends BaseModel {
static get database() {
return async () => SQLite.openDatabase('database.db')
}
}
Och du kan få en databasreferens:
const db = await Animal.database()
Lekplats
Om olika underklasser skulle returnera olika databaser med olika gränssnitt, kan du istället låta underklasserna definiera den returtypen:
class BaseModel {
static get database(): () => Promise<unknown> { // unknown here
throw new Error('DB not defined')
}
}
Lekplats
