مشکلات کامپایل node.js - TypeScript با node-postgres


پیشاپیش اعلام میکنم، من تازه با TypeScript آشنا شدهام، بنابراین ممکن است این یک سوال احمقانه باشد!

من در حال تلاش برای استفاده از همان تنظیمات برای برنامه Express/Postgres خود هستم که در مستندات node-postgres توضیح داده شده است، جایی که من یک ماژول واحد دارم که به سرور PostgreSQL متصل میشود و هر جایی که نیاز به دسترسی به آن دارم، گنجانده میشود، اما با نوعهای TypeScript کمی مشکل دارم.

برای این مثال من همه چیز را ساده کردهام تا کاملاً Express حذف شود. اگر این کار را بکنم، همه چیز کار میکند و کامپایلر TypeScript خوشحال است:

import { Pool } from 'pg';

const pool = new Pool({
    host: process.env.PG_HOST,
    port: parseInt(process.env.PG_PORT),
    user: process.env.PG_USER,
    password: process.env.PG_PASSWORD,
    database: process.env.PG_DATABASE,
});

(async function getRows() {
    const result = await pool.query('SELECT id, message, created FROM media');

    interface dbObject {
        id: number,
        message: string,
        created: Date
    }
    await result.rows.map((row: dbObject) => {
        console.log(row.id);
        console.log(row.message);
        console.log(row.created);
    })
})()

با این حال، اگر توابع pg را به ماژول جداگانه db.ts منتقل کنم:

import { Pool } from 'pg';

const pool = new Pool({
    host: process.env.PG_HOST,
    port: parseInt(process.env.PG_PORT),
    user: process.env.PG_USER,
    password: process.env.PG_PASSWORD,
    database: process.env.PG_DATABASE,
});

export = {
    query: (text, params) => pool.query(text, params),
}

و آن را به فایل اصلی app.ts وارد کنید:

import database from './db';

(async function getRows() {
    const result = await database.query('SELECT id, message, created FROM media', []);

    interface dbObject {
        id: number,
        message: string,
        created: Date
    }
    await result.rows.map((row: dbObject) => {
        console.log(row.id);
        console.log(row.message);
        console.log(row.created);
    })
})()

من چندین شکایت دریافت میکنم:

src/app.ts:11:27 - error TS2345: Argument of type '(row: dbObject) => void' is not assignable to parameter of type '(value: any[], index: number, array: any[][]) => void'.
  Types of parameters 'row' and 'value' are incompatible.
    Type 'any[]' is missing the following properties from type 'dbObject': id, message, created

11     await result.rows.map((row: dbObject) => {
                             ~~~~~~~~~~~~~~~~~~~~


Found 1 error.

من متوجه هستم که احتمالاً به این دلیل است که هیچ نوعی به تابع query در فایل db.ts خود اضافه نکردهام، اما در واقع نمیدانم چگونه آنها را به درستی اضافه کنم تا همه اینها کار کند!

پاسخ شماره ۱

خب، به نظر میرسد این کار میکند! من فقط db.ts را تغییر دادم تا به طور مستقیم pool را صادر کند:

import { Pool } from 'pg';

const pool = new Pool({
    host: process.env.PG_HOST,
    port: parseInt(process.env.PG_PORT),
    user: process.env.PG_USER,
    password: process.env.PG_PASSWORD,
    database: process.env.PG_DATABASE,
});

export = pool;