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

TypeScript:如何重置通过依赖注入(DI)注入的服务的所有属性值

前置修正

你的代码存在两处基础问题,需要先修复才能正常访问Bar实例:

  1. 类定义语法错误:class Foo() 不需要加括号,正确写法为 class Foo
  2. 注入的实例没有挂载到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:24:02