【发布时间】:2020-02-23 13:01:22
【问题描述】:
我对 TypeScript 相当陌生,并开始将我现有的服务器从 ES6 转换为 TypeScript。我有点迷茫,想弄清楚如何为异步函数声明类型。这是来自 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> => {...} 这样以某种方式声明返回类型吗?那么,如果 promise 被拒绝,会发生什么?那不再是 QueryResult 类型了。我试图阅读有关 node-postgres 和 TypeScript 函数类型声明的文档,但我一无所获。我应该怎么做这些?或许我也应该开始学习声明文件了。
【问题讨论】:
标签: typescript async-await typing node-postgres