Как набрать функции запроса node- postgres asyn c в TypeScript? - PullRequest
0 голосов
/ 22 февраля 2020

Я довольно новичок в TypeScript и начал преобразовывать свой существующий сервер из ES6 в TypeScript. Я немного растерялся и пытаюсь понять, как объявлять типы для асин c функций. Вот заглушка из кода ES6:

// db.js
import { Pool } from 'pg';

const pool = new Pool({
  connectionString: 'process.env.DB_CONNECTION',
});

export default {

  query(text, params) {
    return new Promise((resolve, reject) => {
      try {
        const result = pool.query(text, params);
        return resolve(result);
      } catch (error) {
        return reject(error);
      }
    });
  },
};

// controller for a table
const Table = {
  getOne: async (id) => {
    return await db.query('SELECT * FROM table WHERE id=$1', [id]);
  },
}

Это отлично работает и может быть обработано путем использования части в блоке try / catch и работает ли запрос возвращает результат или ошибку. Теперь, как я должен набрать их в машинописи? Я попытался сделать это:

import { Pool } from 'pg';

const pool = new Pool({
  connectionString: 'process.env.DB_CONNECTION',
});

export default {

  query(text: string, params: any[]) {
    return new Promise((resolve, reject) => {
      try {
        const result = pool.query(text, params);
        return resolve(result);
      } catch (error) {
        return reject(error);
      }
    });
  },
};

// controller
import { QueryResult } from 'pg';

const Table = {
  getOne: async (id: string) => {
    return await db.query('SELECT * FROM table WHERE id=$1', [id]) as QueryResult;
  },
}

Теперь, это компилируется, но есть пара вещей, которые я не получаю. Во-первых, совершенно бесполезно всегда приводить эти возвращаемые типы с помощью «as» Разве я не должен быть в состоянии объявить тип возвращаемого значения как это getOne: async (id: string): Promise<QueryResult> => {...}? Что произойдет, если обещание будет отклонено? Это больше не тип QueryResult. Я попытался прочитать документацию о объявлениях типов функций node- postgres и TypeScript, но ничего не получилось. Как я должен это сделать? Также, вероятно, я должен начать изучать файлы объявлений.

1 Ответ

1 голос
/ 22 февраля 2020

asyn c функции неявно возвращают обещания

пример:

// Declare async function
async function getRandomNumberAsync(max: number): Promise<number> {
  return Math.floor(Math.random() * Math.floor(max));
}

// Call it (errors are handled with a try/catch)
try {
  const result = await getRandomNumberAsync(100);
  console.log(result);
} catch (e) {
  console.error("something went wrong");
}

async / await - это просто синтаксический сахар (за кадром асинхронное / ожидающее использование Promises). Этот код в основном эквивалентен приведенному выше коду

function getRandomNumberAsync(max: number): Promise<number> {
  return Promise.resolve(Math.floor(Math.random() * Math.floor(max)));
}

getRandomNumberAsync(100).then(result => {
  console.log(result);
}).catch(e => {
  console.error("something went wrong");
})

. Я вижу, что в вашем коде вы используете return await, что является избыточным. Есть даже правило для предотвращения этого

Ваш код должен выглядеть примерно так

const Table = {
  getOne: async (id: string): Promise<QueryResult> => {
    return db.query('SELECT * FROM table WHERE id=$1', [id]);
  },
}

// "getOne" should be called like this
try {
  const result = await Table.getOne("YOUR_ID");
  // handle result
} catch (e) {
  // handle error
}

, если вы не хотите обрабатывать query ошибки внутри getOne

Это должно выглядеть примерно так

const Table = {
  getOne: async (id: string): Promise<QueryResult | string> => {
    try {
      return await db.query("SELECT * FROM table WHERE id=$1", [id]);
    } catch (e) {
      return "something went wrong";
    }
  },
}
...