Zonebit

个人的奋斗还是历史的进程?

View the Project on GitHub

26 September 2024

Type vs interface

by

type vs interface

type即是类型别名,区别主要在于继承、被类实现、重新声明


看一个交叉类型的声明

interface InterfaceA {
  id: number;
  name: string;
}

interface InterfaceB {
  id: string;
  age: number;
}

type C = InterfaceA & InterfaceB

这种场景下C的id属性会被声明为never类型


在TypeScript中,typeinterface都可以用来定义类型,但它们之间存在一些差异和各自的用途:

  1. 语法差异
    • interface可以使用extends关键字来实现继承,可以继承多个接口。
    • type可以使用&操作符来合并多个类型,但不是继承关系。
  2. 继承
    • interface支持多继承,一个接口可以继承多个其他接口。
    • type不支持多继承,但可以通过交叉类型与其它类型组合。
  3. 重新声明
    • interface可以被重新声明(declaration merging),这意味着你可以在不同的文件中多次声明同一个接口,并且这些声明会被合并。
    • type不允许重新声明,每个类型名称必须是唯一的。
  4. 实现
    • interface可以被类实现(implement),这是定义共享结构的一种方式。
    • type不能被类实现,但可以在类中使用类型别名。
  5. 属性初始化
    • interface中的属性默认都是可选的,除非它们被赋值了。
    • type定义的属性默认都是必需的。
  6. 索引签名
    • interface支持索引签名,允许你定义一个对象,该对象的属性名是动态的,但类型是相同的。
    • type也支持索引签名。
  7. 构造函数签名
    • interface可以包含构造函数签名。
    • type也可以包含构造函数签名。
  8. 工具和库
    • 在一些第三方库中,可能会看到使用interface来定义公共API,以便其他库可以通过implements来扩展这些API。
    • type更多地用于在应用程序代码中定义具体的类型。
  9. 联合和交叉类型
    • type可以很容易地与联合和交叉类型结合使用,因为它们都是使用相同的类型别名系统。
    • interface不能直接与联合和交叉类型结合使用,需要使用类型断言或类型守卫。
  10. 类型别名
    • type可以为联合、交叉、元组等复杂类型提供别名,这在处理复杂类型时非常有用。

在实际开发中,选择使用type还是interface通常取决于个人或团队的偏好,以及具体的使用场景。例如,如果你需要定义一个可以被多个类实现的结构,interface可能是更好的选择。如果你需要定义一个复杂的联合类型,type可能更合适。

tags: