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

为带默认值的异步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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:37:35