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

依赖倒置原则是否必须使用接口?TypeScript场景探讨

关于TypeScript中依赖倒置原则的疑问

我看过多种编程语言里SOLID原则中**依赖倒置(Dependency Inversion)**的经典示例,比如下面这段代码就是典型的类A直接依赖类B的场景:

// A 依赖于 B
class A {
  property;

  constructor() {
    this.property = (new B()).property;
  }
}

new A();

几乎所有示例都会用接口的等效方式来实现依赖倒置,比如这样:

interface Dependency {
  property: string
}

class B implements Dependency { ... }

// A 不再直接依赖于 B
class A {
  property;

  constructor(dep: Dependency) {
    this.property = dep.property;
  }
}

new A(new B());

在我看来,接口(或者其他语言里的抽象类)的核心用途其实是辅助测试——很多语言需要这类机制,才能让测试框架注入模拟(mock)版本替代原始实现来完成测试。

当然,使用接口也允许在运行时切换不同的实现,但根据我的经验,我写的99%的代码里,大部分类都只需要特定结构的精确依赖,很少会去编写另一个实现同一接口但功能不同的类,这种需求也几乎不会随时间变化。

我在编写TypeScript单元测试时,不用接口也能通过多种方式模拟依赖。那既然我只会有一个运行时实现,接口对于依赖倒置原则来说是不是必需的?

另外还有一个疑问:在TypeScript(以及无类型的JavaScript)中,依赖倒置原则是不是真的像下面这段代码这么简单?

// A 不再依赖于 B?
class A {
  property;

  constructor(b: B) {
    this.property = b.property;
  }
}

new A(new B());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:32:35