如何解决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
相关产品推荐
相关产品推荐

