如何通过Lambda函数传递对象,让子类始终获取最新依赖引用?
解决方案:通过Lambda函数同步子类依赖引用
问题根源
你传递给子类的dep1是一个函数,而非直接的依赖实例。直接访问dep1.METHOD_REFERENCE会报错,因为函数本身没有这个属性;dep1.call()的用法也不对——lambda函数的this已经被词法绑定,直接调用即可。
修正后的实现步骤
1. 保留Manager类中的Lambda函数定义
你的Lambda写法是正确的,它会始终返回最新的_dep1Object引用:
private dep1 = (): Dep1 => { return this._dep1Object; };
2. 给子类的依赖参数明确类型
在子类的构造函数或接收依赖的逻辑中,将依赖参数的类型定义为() => Dep1,避免TypeScript类型校验报错:
class ChildClass { constructor(private getDep1: () => Dep1) {} someBusinessMethod() { // 先调用函数获取最新实例,再访问目标方法 const latestDep1 = this.getDep1(); latestDep1.METHOD_REFERENCE(); } }
3. 子类中正确调用Lambda获取依赖
不要用dep1.call(),直接调用函数即可拿到最新实例:
// 错误写法 dep1.METHOD_REFERENCE; dep1.call().METHOD_REFERENCE; // 正确写法 dep1().METHOD_REFERENCE();
替代优化方案(可选)
如果觉得每次手动调用函数麻烦,可以封装一个代理对象,自动将属性/方法调用转发到最新的依赖实例:
private createDepProxy<T>(getInstance: () => T): T { return new Proxy({}, { get(_, prop) { return (getInstance() as any)[prop]; } }) as T; } // 传递代理给子类 const dep1Proxy = this.createDepProxy(() => this._dep1Object); const child = new ChildClass(dep1Proxy); // 子类中可直接访问,无需手动调用函数 child.dep1.METHOD_REFERENCE();
这个方案的好处是子类代码无需修改,和直接使用依赖实例的写法完全一致,仅需注意代理带来的微小性能开销(常规业务场景可忽略)。
内容的提问来源于stack exchange,提问作者shashankg77
相关产品推荐
相关产品推荐

