TS中interface和type的区别

interface 与 type 的基本区别

interface 是 TypeScript 专门用于定义对象类型结构的语法,强调“形状”描述。它支持合并声明(同名接口自动合并),且通常用于对象、类的类型定义。

type 是类型别名,可以定义任何类型(包括原始类型、联合类型、交叉类型等)。它不支持合并声明,但灵活性更高,适合复杂类型逻辑。


核心差异点

扩展方式
interface 使用 extends 继承:

interface A { x: number }
interface B extends A { y: string }

type 使用交叉类型 &

type A = { x: number }
type B = A & { y: string }

合并行为
interface 允许重复声明并自动合并:

interface User { name: string }
interface User { age: number }
// 最终 User 包含 name 和 age

type 重复声明会报错。

兼容性
interface 专为对象设计,提供更好的错误提示;type 能表达更广泛的类型,如:

type Primitive = string | number | boolean


设计两种方式的原因

  1. 历史原因
    interface 早期用于描述对象形状,而 type 后来引入以支持更复杂的类型运算。

  2. 场景互补

    • 需要扩展或合并时(如库类型定义)优先用 interface。
    • 需要组合类型或定义非对象类型时(如联合类型、元组)必须用 type。
  3. 语义清晰性
    interface 明确表示“对象契约”,type 更偏向“类型别名”,两者语义不同。


实际应用建议

  • 优先用 interface
    对象类型定义、类实现(implements)或需要声明合并时。

  • 选择 type 的情况
    需要联合类型、映射类型或复杂类型运算时:

    type Partial<T> = { [P in keyof T]?: T[P] }
    

  • 一致性
    项目内保持统一,避免混用造成理解成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值