TypeScript:如何重置通过依赖注入(DI)注入的服务的所有属性值
前置修正
你的代码存在两处基础问题,需要先修复才能正常访问Bar实例:
- 类定义语法错误:
class Foo()不需要加括号,正确写法为class Foo - 注入的实例没有挂载到Foo实例上,需要在构造函数内补全挂载逻辑
class Foo { bar: Bar constructor(bar: Bar) { // 补全这行挂载逻辑,后续才能通过this.bar访问注入的实例 this.bar = bar } initBarProps() { this.bar.name = "Hello World!"; this.bar.number = "1234"; } }
重置Bar实例的三种方案
方案1:在Bar类内封装重置方法(最推荐)
该方案逻辑内聚、可维护性最高,后续Bar新增属性只需要同步修改reset方法即可:
class Bar { name: string = '' number: string = '' // 其他自定义属性... reset() { // 所有属性重置为你期望的初始值 this.name = '' this.number = '' // 其他属性的重置逻辑... } }
在Foo中需要重置时直接调用即可:
resetBar() { this.bar.reset() }
方案2:遍历属性批量重置(适合无法修改Bar类源码的场景)
如果不能修改Bar的源码,可以遍历实例的可枚举属性逐个重置:
resetBar() { Object.keys(this.bar).forEach(key => { const value = this.bar[key] // 按属性类型赋值初始值,可根据业务需求调整 if (typeof value === 'string') { this.bar[key] = '' } else if (typeof value === 'number') { this.bar[key] = 0 } else { this.bar[key] = null } }) }
注意:该方法只能重置公共可枚举属性,无法处理私有属性、Symbol类型的属性。
方案3:替换为全新的Bar实例(适合多例注入场景)
如果你的DI容器配置的Bar为多例模式(每个注入位置拿到的是独立实例),可以直接向DI容器请求新的Bar实例替换旧实例:
// 此处以InversifyJS的调用方式为例,根据你使用的DI容器调整对应API即可 resetBar() { this.bar = container.get<Bar>(Bar) }
注意:如果Bar是单例注入,不要使用该方案,否则会影响所有依赖Bar的其他模块。
内容的提问来源于stack exchange,提问作者pdk
相关产品推荐
相关产品推荐

