你好,我想知道在Redis中哪种类型的删除功能是正确的.代码如下所示.

/**
 * Delete a key
 * - _group_: generic
 * - _complexity_: O(N) where N is the number of keys that will be removed. When a key to remove holds a value other than a string, the individual complexity for this key is O(M) where M is the number of elements in the list, set, sorted set or hash. Removing a single key that holds a string value is O(1).
 * - _since_: 1.0.0
 */
del(...args: [...keys: RedisKey[], callback: Callback<number>]): Result<number, Context>;
del(...args: [keys: RedisKey[], callback: Callback<number>]): Result<number, Context>;
del(...args: [...keys: RedisKey[]]): Result<number, Context>;
del(...args: [keys: RedisKey[]]): Result<number, Context>;

所以我的函数是这样的

 public async del(key: RedisKey[] | RedisKey) {
    return this._redis.del(key)
  }

以下是RedisKey声明

export declare type RedisKey = string | Buffer;

由于某些原因,不可能同时传递字符串或字符串array.

获取此错误

TS2769: No overload matches this call.   Argument of type '[RedisKey | RedisKey[]]' is not assignable to parameter of type '[...keys: RedisKey[], callback: Callback<number>]'.     Type at position 0 in source is not compatible with type at position 1 in target.       Type 'RedisKey | RedisKey[]' is not assignable to type 'Callback<number>'.         Type 'string' is not assignable to type 'Callback<number>'.   Overload 2 of 4, '(...args: RedisKey[]): Promise<number>', gave the following error.     Argument of type 'RedisKey | RedisKey[]' is not assignable to parameter of type 'RedisKey'.       Type 'RedisKey[]' is not assignable to type 'RedisKey'.         Type 'RedisKey[]' is missing the following properties from type 'Buffer': write, toJSON, equals, compare, and 73 more.   Overload 3 of 4, '(keys: RedisKey[]): Promise<number>', gave the following error.     Argument of type 'RedisKey | RedisKey[]' is not assignable to parameter of type 'RedisKey[]'.       Type 'string' is not assignable to type 'RedisKey[]'.

error code

如果我只放RedisKey[]RedisKey,它会像预期的那样工作,但它不会对这两种类型都起作用.请说明一下,由于有4个del()声明,我不确定发生了什么事?函数应该只接受字符串或字符串数组这两种类型,所以我只想删除redis中的一个键或多个键.

推荐答案

处理参数key并使redis.del()的参数与重载签名之一匹配.

import Redis, { RedisKey } from 'ioredis';

const redis = new Redis();

async function del(key: RedisKey[] | RedisKey) {
    const keys = Array.isArray(key) ? key : [key];
    return redis.del(keys);
}

del('key'); // ok
del(['key1', 'key2']); //ok
del('key1', 'key2'); // error

Playground Link

import Redis, { RedisKey } from 'ioredis';

const redis = new Redis();

async function del(...args: [...keys: RedisKey[]] | [keys: RedisKey[]]) {
    return redis.del(args.flat());
}

del('key');  // ok
del(['key1', 'key2']); // ok
del('key1', 'key2'); // ok

Playground Link

套餐版本:"ioredis": "^5.3.2"

Node.js相关问答推荐

使用prisma迁移到SQL失败

Gmail API获取附件PDF未正确呈现.我遗漏了什么?

如何修复PostgreSQL和NodeJS/NestJS应用程序之间的日期时间和时区问题?

FiRestore UPDATE方法引发错误:&Quot;错误:13内部:收到代码为1&Quot;的RST_STREAM

Nest Js - 在 multer 拦截器中如何设置最大文件上传大小并进行可选文件上传

Next.js 路由不起作用 - 页面未正确加载

Express Web 服务器部署到 prod 但 GET 返回超时错误

在生产环境中,Nest实例启动时抛出不完整的导入错误

未授权使用联合身份未授权用户角色从 Amplify graphQL 访问类型 Y 上的 X

Jest - SyntaxError: 不能在@nestjs/axios 的模块外使用 import 语句

如何让我的 Next.js 应用在运行 ubuntu-latest 的 Azure 应用服务中启动?

配额超出了每分钟的 Sheets API 写入请求数. node .js

yarn.lock 和 npm 的 package-lock 有什么区别?

使用 Webpack 和 font-face 加载字体

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

User.findOrCreate 函数是做什么的,什么时候在Passport 中调用它?

Puppeteer:如何提交表单?

Express.js:没有这样的文件或目录

我可以有条件地将 where() 子句添加到我的 knex 查询吗?

名称类型为 mongoose 的字段