📜  TypeScript 中的 interface 和 type 有什么区别?(1)

📅  最后修改于: 2023-12-03 15:35:24.292000             🧑  作者: Mango

TypeScript 中的 interface 和 type 有什么区别?

在 TypeScript 中,我们经常使用 interfacetype 来定义自定义类型。尽管它们的区别并不是很大,但它们确实有一些微妙的差异。

interface

interface 定义了一个具有特定属性和方法的对象的结构。它只存在于 TypeScript 的编译期,最终会被编译成纯 JavaScript,不会存在在编译后的代码中。一个 interface 可以继承其他 interface、extending 类型和 implementing 类型。

interface 的语法如下(以定义一个 Person 数据类型为例):

interface Person {
  firstName: string;
  lastName: string;
  age: number;
  sayHello(): string;
}

其中,Person 对象必须包含 firstNamelastNameage 这三个属性,以及一个方法 sayHello,该方法返回一个字符串。

type

type 则是更加通用的类型定义方式。它类似于 interface,但可以定义更复杂的类型。type 也只存在于 TypeScript 的编译期,最终会被编译成纯 JavaScript,不会存在在编译后的代码中。type 可以定义联合类型、交叉类型、元组、函数类型等复杂的类型。

type 的语法如下(以定义一个 Name 数据类型为例):

type Name = {
  firstName: string;
  lastName: string;
};

比较 interface 和 type:

  • interface 可以被类实现和继承,type 不能。
  • interface 可以扩展其他的 interface 或 class,type 则不能。
  • type 可以定义更多的类型,比如 union、tuple、别名类型等。
如何选择?

interface 和 type 是互相补充的,应当根据不同场景选择不同的方式。

  • 如果需要定义一个对象的结构,推荐使用 interface。
  • 如果需要定义更符合语意的对象结构,推荐使用 interface。
  • 如果需要定义一个类型(比如联合类型、交叉类型、元组等),推荐使用 type。
总结

在 TypeScript 中,interface 和 type 都可以用来定义自定义类型。interface 更加专注于定义对象的结构,并支持继承和扩展;type 更加通用,可以定义更多类型,也可以定义联合类型、交叉类型、元组、函数类型等。在不同的场景下,我们应选择使用不同的方式来定义自定义类型。