2

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

获取键的值。

没有重载匹配此调用。Overload 1 of 14, '(fn: CustomPromisify<(key: string, cb?: Callback) => boolean>): (key: string, cb?: Callback) => boolean',给出以下错误。'(key: string, cb?: Callback) => boolean' 类型的参数不能分配给 'CustomPromisify<(key: string, cb?: Callback) => boolean>' 类型的参数。财产承诺' 在类型 '(key: string, cb?: Callback) => boolean' 中缺失,但在类型 'CustomPromisifyLegacy<(key: string, cb?: Callback) => boolean>' 中是必需的。重载 2 of 14, '(fn: (callback: (err: any, result: (key: string, cb?: Callback) => boolean) => void) => void): () => Promise<(key : string, cb?: Callback) => boolean>',给出以下错误。'(key: string, cb?: Callback) => boolean' 类型的参数不可分配给 '(callback: (err: any, result: (key: string, cb?: Callback) => boolean) 类型的参数=> 无效)=> 无效'。

如何设置正确的签名?

4

1 回答 1

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。

于 2021-08-11T07:31:49.770 回答