我正在使用node.js和Typescript为后端编程。

我还为打字稿安装了“ mysql”模块和“ @ types / mysql”模块。

如您所知,mysql module基本上不支持诺言模式。

当我使用javascript而不是打字稿时,此代码运行良好。

const pool = mysql.createPool(config);
pool.query = util.promisify(pool.query);

export default pool;


但是,在打字稿中pool.queryutil.promisify()的类型不匹配。

所以我想在interface Pool extends EscapeFunctionsnode_modules/@types/mysql/index.d.ts上添加一个新属性

我应该直接编辑node_modules/@types/mysql/index.d.ts文件吗?

或者,有什么安全的方法吗?

最佳答案

据我所知,默认情况下utils.promisify仅支持node.js样式的回调,看起来像(err, result) => void。您的池查询回调被声明为(err, result, fields) => void之类的东西。简短的回答是,不,默认情况下,您无法使用它。

但是,如果您对此有所了解,则可以扩展utils.promisify声明以适合您的模块声明,可以在项目中编写如下内容:

declare module "util" {
    function promisify<T1, TResult, TFields>(fn: (arg1: T1, callback: (err: any, result: TResult, fields: TFields) => void) => void): () => Promise<{ result: TResult, fields: TFields }>;
}


重新声明promisify之后,您现在需要扩展pool.query以支持其他args(如node.js documentation中所述),如下所示:

pool.query[util.promisify.custom] = <TResult, TFields>(query: string) => new Promise<{ result: TResult, fields: TFields }>((resolve, reject) => {
    pool.query(query, (err, result: TResult, fields: TFields) => {
        if (err) { reject(err) }
        else { resolve({ result, fields }) }
    })
});


现在,您的promisify支持该模块,但它不是那么简单,就像手动声明promise甚至创建自己的promisify函数一样,它将支持任意数量的参数。

08-27 04:14