You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决TypeScript报错TS2769:Redis set方法重载不匹配

解决ioredis中set方法的TypeScript类型错误

问题重现

使用ioredis与Config编写Session创建逻辑时,执行以下代码:

// 1. Create Session
redisClient.set(`${user.id}`, JSON.stringify(user), {
  EX: config.get<any>('redisCacheExpiresIn') * 60,
});

触发TypeScript错误:

error TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type '{ EX: number; }' is not assignable to parameter of type 'Callback<"OK">'.
      Object literal may only specify known properties, and 'EX' does not exist in type 'Callback<"OK">'.

29     EX: config.get<any>('redisCacheExpiresIn') * 60,

 node_modules/ioredis/built/utils/RedisCommander.d.ts:3557:5
3557     set(key: RedisKey, value: string | Buffer | number, callback?: Callback<"OK">): Result<"OK", Context>;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The last overload is declared here.

对应的RedisCommander中set方法的重载定义为:

set(key: RedisKey, value: string | Buffer | number, callback?: Callback<"OK">): Result<"OK", Context>;

问题原因

这个错误是因为当前调用匹配到的set方法重载仅支持key、value和可选回调函数参数,不接受配置对象。而带过期时间的配置对象需要使用ioredis中另一个专门的重载版本。

解决方案

方案1:使用Redis命令原生参数形式(推荐)

遵循RedisSET key value EX seconds的原生命令格式,将过期时间作为位置参数传入:

redisClient.set(`${user.id}`, JSON.stringify(user), 'EX', config.get<any>('redisCacheExpiresIn') * 60);

方案2:显式匹配配置对象重载

如果偏好使用对象形式传参,可以通过类型断言或显式声明配置对象类型,让TypeScript匹配到正确的重载:

// 方式1:使用const断言
redisClient.set(`${user.id}`, JSON.stringify(user), {
  EX: config.get<number>('redisCacheExpiresIn') * 60,
} as const);

// 方式2:导入并使用SetOptions类型
import { SetOptions } from 'ioredis';

const setOptions: SetOptions = {
  EX: config.get<number>('redisCacheExpiresIn') * 60,
};
redisClient.set(`${user.id}`, JSON.stringify(user), setOptions);

内容的提问来源于stack exchange,提问作者Hossein Azad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:14:57