Hur man korrekt och fullständigt importerar BetterSqlite3:s Database-klass i TypeScript?


Jag har lite kod som använder better-sqlite3 och jag försöker porta den till TypeScript.

Relevanta delar av den ursprungliga javascriptkoden ser ut så här:

import Database from "better-sqlite3";

/**
 * @param {string} filename
 * @return {Database}
 */
function openDb(filename)
{
    let db;
    db = new Database(/* some arguments */);
    // some initialization
    return db;
}

Efter att ha satt koden i en .ts-fil och lagt till typer ser det ut så här:

import Database from "better-sqlite3";

function openDb(filename: string) : Database
{
    let db : Database;
    db = new Database(/* some arguments */);
    // some initialization
    return db;
}

Jag får felet TS2709: Kan inte använda namnrymden 'Database' som en typ. för alla ställen i koden där Database-symbolen används som en typ.

Om jag använder TypeScript 3.8:s import type, då blir felet omvänt: jag kan använda symbolen som en typ, men inte som en konstruktor.

Finns det något sätt att importera denna symbol på ett sätt som gör att den är känd för TypeScript BÅDE som en konstruktor OCH som en typ? Finns det någon magi som gör att jag kan uttrycka i koden det naturliga tänkandets flöde, "Jag anropar new Something() för att konstruera en Something och sedan returnerar jag nämnda Something", istället för det invecklade tänkandets flöde "Jag anropar new Something() för att konstruera en SomethingUnderADifferentName och sedan returnerar jag nämnda SomethingUnderADifferentName"?

Svar #1

Detta bör fungera i kombination med kompileringsalternativet esModuleInterop:

// index.ts

import DatabaseConstructor, {Database} from "better-sqlite3";

function openDb(filename: string): Database {
    let db: Database = new DatabaseConstructor('/tmp/sqlite.db');
    // Some initialization
    return db;
}

Inga fel returneras när det bearbetas på detta sätt:

tsc --strict --esModuleInterop index.ts

Svar #2

prova detta:

import Database, {Database as DbType} from 'better-sqlite3';
function openDb(filename: string) : DbType
{
    let db : Database;
    db = new Database(/* some arguments */);
    // some initialization
    return db;
}

Relaterade artiklar