如何在第三方模块上添加自定义类型?

时间:2019-04-26 09:08:17

标签: mysql node.js typescript

我正在使用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 EscapeFunctions的{​​{1}}上添加新属性

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

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

1 个答案:

答案 0 :(得分:0)

据我所知,默认情况下utils.promisify仅支持看起来像(err, result) => void的node.js样式的回调。您的池查询回调被声明为(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 }>;
}

重新声明承诺后,您现在需要扩展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函数,即可支持任意数量的参数。