别再一股脑用 TypeScript 的 Interface 了

何时用接口的合并? ——扩展库的公共接口(比如为 ​​@auth/core​​ 的 ​​Session​​ 增补字段)是合理用法。除此之外,日常业务里滥用合并,容易踩坑。

两者功能高度重叠,于是问题来了:谁更好?

这篇文章会系统对比 type 与 interface,并解释为什么在大多数场景里,你更应该优先选 type

让我们直接开始。

它们到底有啥差别?

先看一个最朴素的 “Person” 定义:

type Person = {
  name: string
  age: number
}

interface Person {
  name: string
  age: number
}

乍看几乎一样——只不过 type 用 = 赋值出一个“形状”,而 interface 直接声明。

当然,区别不止于此。继续往下拆。

可扩展性(Extensibility)

很多人会说:接口在“可扩展”上是天然赢家,因为它能用 extends 扩展其它接口:

// 接口扩展
interface Job {
  job: string
}

interface Person extends Job {
  name: string
  age: number
}

const person: Person = {
  name: 'John',
  age: 25,
  job: 'Full-Stack Web Developer',
}

但 type 也能扩展——借助交叉类型 & 或联合类型 | 做组合,而这是接口不能直接表达的:

// ✅ 可行:交叉类型拼装
type Person = {
  name: string
  age: number
} & { job: string }

// ❌ 不可行:interface 不能在声明处用交叉
// interface Person { ... } & { job: string }

结论:如果你偏好“以类型运算搭积木”的风格,type 的表达力更强。

可实现性(Implementation)

在面向对象(OOP)世界,interface 支持被 class 用 implements直接实现,这点与 Java/C# 一致;而 type不能被类直接实现

// OOP 实现示例
interface Work {
  doWork: () =>void
}

class Person implements Work {
  name: string
  age: number

constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  doWork() {
    console.log('Working...')
  }
}

const p = new Person('John', 25)
p.doWork()

结论:如果你大量采用 class + implements 的编码风格,interface 更顺手;否则,type 足够好用。

性能(类型检查速度)

这里说的性能是 TS 编译器的类型检查。随着代码量增长,类型检查耗时会显著升高。 比较结果?没有差别。社区与专家(如 Matt Pocock)已明确说明:**type 与 interface 在类型检查性能上几乎为 0 差异**。

选哪个,不影响编译速度——放心用你喜欢的。

为什么 Interface 可能“埋雷”?

interface 有一个 Type 没有的能力:声明合并(Declaration Merging)

编译器会把同名接口自动合并:

// 初始声明
interface Person {
  name: string
  age: number
}

// 追加声明(合并)
interface Person {
  gender: string
}

const someone: Person = { name: 'John', age: 25, gender: 'Male' }

好处:无需改动源定义,就能给已有接口加字段。例如给第三方库的接口“加料”,很方便。

坏处:可能带来意料之外的行为

  1. 声明顺序优先后声明覆盖前声明。分散在不同文件/依赖里时,容易出现不可预期的形状。
  2. 与类的合并不安全:编译器不会替你校验属性初始化,某些情况下可能留下运行时空值风险。

相对地,type是不可再声明的,没有“合并”这一套,因此更直观、更可控

何时用接口的合并? ——扩展库的公共接口(比如为 @auth/core 的 Session 增补字段)是合理用法。除此之外,日常业务里滥用合并,容易踩坑。

快对照:什么时候用谁?

  • 需要 class implements OOP 语义 → interface
  • 需要 声明合并(扩展三方库接口) → interface
  • 需要 联合/交叉/条件类型 等类型运算,或者更灵活的组合表达 → type
  • 追求可维护性、避免隐式变更,不希望同名合并 → type
  • 关心编译性能 → 两者无差异,随意

结论

除非你确实需要接口的特定能力(如 OOP implements 或对三方类型做声明合并),否则在大多数日常场景里:

  • **优先使用 type**:

表达力强(交叉、联合、条件、映射等)

心智模型简单(没有合并副作用)

与接口在性能上等价

类型系统要的是“可预期”与“可维护”。 在这两点上,type 更少“隐藏魔法”,更能让你的团队远离因合并导致的灰色地带。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值