Typescript中 interface 和 type 的差别是什么?

80 阅读2分钟

在 TypeScript 中,interfacetype 关键字都可以用来定义类型,但它们在某些方面有着不同的用途和特性。

  1. 扩展性

    • Interface:接口主要设计用来定义对象的形状,它们可以通过 extends 关键字互相扩展。接口也支持多重继承,即一个接口可以继承多个接口。
    • Type:类型别名可以用来定义一个类型的别名,它不仅限于对象类型,也可以是任何其他类型(如原始类型、联合类型、元组等)。类型别名使用交集操作符 & 来组合现有的类型,但这不完全等同于接口的继承。
  2. 声明合并

    • Interface:接口支持声明合并。这意味着你可以在程序的不同部分多次声明同一个接口,TypeScript 会将它们视为单个接口。
    • Type:类型别名不支持声明合并。如果你尝试重新声明一个已经存在的类型别名,TypeScript 会抛出错误。
  3. 使用场景

    • Interface:更适合定义对象或类的形状,尤其是当你需要利用到扩展或实现(implement)的特性时。
    • Type:更加灵活,适用于定义联合类型、元组以及其他需要明确类型的情况。
  4. 可扩展与封闭性

    • Interface:通常被视为开放的,因为你可以在程序的任何地方添加更多的字段到一个已存在的接口。
    • Type:被视为封闭的,因为一旦一个类型别名被定义,就不能修改它来添加新的属性。

如果你需要定义对象的结构并且可能需要将它们扩展或合并,那么 interface 是一个好的选择。如果你需要定义一个可能不只是对象的复杂类型或者需要使用联合、元组等更复杂的类型结构,type 将是更合适的工具。