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

Posted

技术标签:

【中文标题】promisify redis 获取并返回正确的打字稿类型【英文标题】:promisify redis get and return the correct typescript type 【发布时间】:2021-02-10 15:53:07 【问题描述】:

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

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 显示一些错误:

获取键的值。

没有重载匹配这个调用。重载 1 的 14, '(fn: CustomPromisify boolean>): (key: string, cb?: Callback) => boolean',给出如下 错误。 '(key: string, cb?: Callback) => boolean' 类型的参数不能分配给 'CustomPromisify 布尔值>'。 类型 '(key: string, cb?: Callback) => boolean' 中缺少属性 'promisify' 但在类型中是必需的 'CustomPromisifyLegacy 布尔值>'。重载 2 of 14, '(fn: (callback: (err: any, result: (key: string, cb?: Callback) => boolean) => void) => void): () => Promise boolean>',给出以下错误。 '(key: string, cb?: Callback) => boolean' 类型的参数不能分配给 '(callback: (err: any, result: (key: string, cb?: Callback) => boolean) => void) => void'。

如何设置正确的签名?

【问题讨论】:

你最后解决了这个问题吗?面临类似的问题。谢谢! @JavierGuzmán nope... 【参考方案1】:

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

不确定这是否是最佳解决方案,但我所做的是扩展了 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。

【讨论】:

以上是关于promisify redis 获取并返回正确的打字稿类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 内的 UICollectionView 内获取数组数组并返回正确数量的项目?

util.promisify 的那些事儿

在 Redis 中获取正确类型的值

用 util.promisify 模拟 bluebird.promisifyAll

在非回调函数上调用 promisify():“有趣”的结果是节点。为啥?

redis分布式锁