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
相关产品推荐
相关产品推荐

