interface 和 type

221 阅读2分钟

在 TypeScript 中,interface 和 type 都用于描述对象或函数类型,主要区别在于它们的语法和使用方式不同。下面我来介绍一些具体的区别和应用场景:

  1. 语法区别

interface 的语法:

interface User {
  name: string,
  age: number,
  gender: 'male' | 'female',
}

type 的语法:

type User = {
  name: string,
  age: number,
  gender: 'male' | 'female',
}

可以看到,interface 和 type 的定义方式有所不同,但它们都用来定义相同的用户数据类型。

  1. 声明合并

interface 在定义时可以重复声明,这样它们会自动合并为一个类型,例如:

interface User {
  name: string,
}

interface User {
  age: number,
}

let user: User = {
  name: 'Bob',
  age: 30,
}

以上示例中,两个 User 接口中的属性合并成了一个 User 接口,最终的 user 变量可以正确地使用。

而 type 则不支持声明合并。

  1. 类型别名

type 可以用于定义类型别名,例如:

type Gender = 'male' | 'female'

type User = {
  name: string,
  age: number,
  gender: Gender
}

以上示例中,Gender 类型别名可以被重复使用,并且可以像内置类型一样被定义。

  1. 联合和交叉类型

type 支持联合和交叉类型,在定义时可以使用 & 和 | 运算符,例如:

type UserA = {
  name: string,
  age: number,
}

type UserB = {
  gender: 'male' | 'female',
}

type User = UserA & UserB

let user: User = {
  name: 'Bob',
  age: 30,
  gender: 'male',
}

以上示例中,User 类型使用 & 运算符将 UserA 和 UserB 类型合并成一个类型,最终的 user 变量可以正确地使用。

而 interface 不支持交叉类型,只支持联合类型:

interface UserA {
  name: string,
  age: number,
}

interface UserB {
  gender: 'male' | 'female',
}

interface User extends UserA, UserB {}

let user: User = {
  name: 'Bob',
  age: 30,
  gender: 'male',
}

以上示例中,User 接口使用 extends 关键字将 UserA 和 UserB 接口合并成一个接口,最终的 user 变量可以正确地使用。

  1. 普通对象和类构造函数

interface 可以用来描述普通对象,例如:

interface Point {
  x: number,
  y: number,
}

let point: Point = {
  x: 10,
  y: 20,
}

而 type 则更适用于描述类构造函数:

type Point = {
  new (x: number, y: number): { x: number, y: number },
}

let point: Point = class {
  constructor(public x: number, public y: number) {}
}

以上示例中,Point 类型使用 new 关键字定义了一个类构造函数,point 变量可以正确地使用。

总之,interface 和 type 在 TypeScript 中都用于描述对象或函数类型,但是语法和使用场景有所不同。通常来说,interface 更适用于描述普通对象类型,而 type 更适用于描述复杂类型,如函数类型、泛型类型、联合类型和交叉类型等。可以根据场景和需求选择合适的语法和类型定义方式。