node.js - promisify redis 获取并返回正确的打字稿类型
问题描述
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) 类型的参数=> 无效)=> 无效'。
如何设置正确的签名?
解决方案
我只是有一个类似的问题。
不确定这是否是最佳解决方案,但我所做的是扩展了 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。
推荐阅读
- database - Cassandra:如何在没有受 EQ 或 IN 限制的 PRIMARY KEY 的情况下使用“ORDER BY”?
- javascript - Javascript对象在innerHTML中不起作用
- postgresql - 如何将 PostgreSQL 与 Corda 3.0 或 Corda 4.0 集成?
- javascript - 在 Wordpress 中使用 Visual Composer 和 Mega Menu 出现 lodash 错误
- rabbitmq - RabbitMQ 用户无权访问管理 UI,但可以发布和订阅
- google-cloud-functions - google actions sdk:使用第三方服务器构建模板化响应
- wordpress - 短代码在段落标签下的 Wordpress 上不起作用
- php - 将默认控制器更改为新控制器时页面出现 404 错误
- jquery - JQuery如何不对隐藏项目应用过滤器
- c# - 如何为 protobuf 映射设置值
C#中的属性