为带默认值的异步Getter函数添加TypeScript类型的方案
解决Redis异步获取方法的类型优化问题
你可以通过函数重载或者泛型结合类型约束来实现需求,两种方案都能让TypeScript正确推断类型,同时保留默认值的可选性:
方案一:函数重载
通过定义多个函数签名,分别处理「传入默认值」和「不传入默认值」的场景,让类型推断更精准:
// 签名1:不传入默认值,必须显式指定泛型T,返回值可能为T或null async get<T>(key: string): Promise<T | null>; // 签名2:传入默认值,自动从def_value推断T,返回值一定是T async get<T>(key: string, def_value: T): Promise<T>; // 实际实现逻辑 async get<T>(key: string, def_value?: T): Promise<T | null> { const v = await redisInstance.get(key); // 注意:Redis返回的是字符串,需根据存储格式做类型转换(示例为JSON解析) if (v !== null) { try { return JSON.parse(v) as T; } catch { return v as unknown as T; } } return def_value ?? null; }
使用示例:
- 不传入默认值,必须显式指定类型:
// 返回类型 Promise<string[] | null> const arr = await get<string[]>("my_key"); - 传入默认值,自动推断类型:
// 返回类型 Promise<number>,从默认值0自动推断T为number const num = await get("count_key", 0);
方案二:泛型结合默认类型约束
如果不想用重载,可以给泛型T设置默认值为never,强制不传默认值时必须显式指定类型:
async get<T = never>(key: string, def_value?: T): Promise<T> { const v = await redisInstance.get(key); if (v) { return JSON.parse(v) as T; } return (def_value ?? null) as T; }
这个方案的特点:
- 不传默认值时,必须显式指定T,否则TypeScript会抛出类型错误(因为默认值
never无法匹配任何实际类型) - 传入默认值时,自动从def_value推断T的类型
使用示例:
// 必须显式指定类型,否则报错 const str = await get<string>("name_key"); // 自动推断T为boolean const flag = await get("active_key", false);
额外提示
Redis的get方法原生返回字符串或null,所以实际实现中一定要根据存储的数据格式做类型转换(比如JSON解析),否则直接返回的字符串可能和你期望的T类型不匹配,上面的示例已经加入了基础的解析逻辑,你可以根据业务场景调整。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

