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

TypeScript使用工厂函数生成单例丢失类型如何解决?

解决方案

你可以直接使用TypeScript内置的ReturnType工具类型提取Factory函数的返回值类型,给instance变量标注该类型即可,完全不需要手动重复定义结构,符合你的所有约束条件。

修改后的完整代码如下:

const Factory = (args?: Record<string, unknown>) => {
  return {
    action: {
        method: (code: 'SOME'|'CODES') => console.log('Doing something with', code)
    }
  }
}

// 核心:自动推导并复用Factory的返回值类型,无需手动写接口
let instance: ReturnType<typeof Factory>

export default (args?: Record<string, unknown>) => {
  if (!instance)
    instance = Factory(args)
  return instance
}

说明

  • typeof Factory会先获取Factory函数本身的类型,再通过ReturnType提取它的返回值类型,完全复用TypeScript自动推导的所有类型定义,不需要手动编写匹配结构的接口,符合第一个约束。
  • 原有运行时逻辑完全没有改动,实例还是在用户第一次调用导出函数时才初始化,支持任意运行时机初始化,符合第二个约束。
  • 不需要改成类实现,原有工厂函数的嵌套结构、方法逻辑完全保留,所有嵌套方法的类型会完整继承,符合第三个约束。

修改后调用导出的默认函数拿到实例,访问instance.action.method时会正常提示code参数可选值为SOME/CODES,和直接调用Factory拿到的实例类型完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:03