承诺redis获取并返回正确的打字稿类型

时间:2020-10-28 09:44:17

标签: node.js typescript redis node-promisify

redis节点库中的redis方法get具有以下打字稿签名:

export interface Commands<R> {
    get(key: string, cb?: Callback<string | null>): R;
}

如果我使用promisify方法,签名将丢失并且返回类型将变为any

我试图以这种方式设置正确的签名:

const client = redis.createClient(redisOption);
const getAsync = promisify<redis.Commands<boolean>['get']>(client.get).bind(client);

但是ts lint显示一些错误:

获取键的值。

没有重载匹配此调用。 14重载1,'(fn: CustomPromisify <(键:字符串,cb ?:回调)=>布尔值>): (key:string,cb ?: Callback)=> boolean',给出了以下内容 错误。 类型'(key:string,cb ?: Callback)=> boolean'的参数不能分配给'CustomPromisify <(key:string, cb ?: Callback)=> boolean>'。 类型((key:string,cb ?: Callback)=> boolean)类型中缺少属性' promisify '但类型中必需 'CustomPromisifyLegacy <(键:字符串,cb ?:回调)=> boolean>。重载2之14,'(fn:(回调:(err:任何,结果: (键:字符串,cb ?:回调)=>布尔)=>无效)=>无效):() => Promise <(键:字符串,cb ?:回调)=>布尔值>',给出了以下错误。 类型'(key:string,cb ?: Callback)=> boolean'的参数不能分配给类型'(callback:(err:any,result: (键:字符串,cb ?:回调)=>布尔值=>无效)=>无效'。

如何设置正确的签名?

1 个答案:

答案 0 :(得分:0)

我刚刚遇到了类似的问题。

不确定这是否是最佳解决方案,但我所做的是扩展了 RedisClient 接口,然后覆盖了 get 方法类型。

import util from "util";
import redis  from "redis";

interface PromiseRedis extends Omit<redis.RedisClient, "get"> {
  get(key: string): Promise<string | boolean> | boolean;
}

const url = "redis://127.0.0.1:6379";
const redisClient:PromiseRedis = redis.createClient(url);
redisClient.get = util.promisify(redisClient.get)

现在 get 函数返回一个 Promise。