Я довольно новичок в 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, но ничего не получилось. Как я должен это сделать? Также, вероятно, я должен начать изучать файлы объявлений.