【问题标题】:How can I add custom type on third-party module?如何在第三方模块上添加自定义类型?
【发布时间】:2019-04-26 22:36:16
【问题描述】:

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

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

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

当我使用 javascript 而不是 typescript 时,这段代码运行良好。

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

export default pool;

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

所以我正在尝试在interface Pool extends EscapeFunctionsnode_modules/@types/mysql/index.d.ts 中添加一个新属性

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

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

【问题讨论】:

  • 也许:pool.query = util.promisify(pool.query) as any;?
  • @Paleo 这行得通。谢谢。

标签: mysql node.js typescript


【解决方案1】:

据我所知,默认情况下 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 函数,这将支持任意数量的参数。

【讨论】:

  • 谢谢,util.promisify.custom 是什么?
  • 它是Symbol 类型的唯一常量值。它可以用作对象键,以确定唯一属性,避免潜在的干扰,例如当您使用字符串作为属性的键时。在这种情况下,它用于安全地将属性添加到 pool.query 函数。
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 2020-04-01
  • 2016-07-23
  • 2021-03-13
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多