interface定义ts类型和type有什么不同

125 阅读2分钟

TypeScript 中,interfacetype 都可以用来定义对象的类型,但它们有一些不同之处和各自的适用场景。以下是它们之间的主要区别和使用建议:

1. 基本用法

  • interface:主要用于定义对象的结构,包括对象的属性和方法。
  • type:可以用于定义任何类型,包括基本类型、联合类型、交叉类型、元组等。

示例:

// 使用interface定义对象类型
interface UserInterface {
  id: number;
  name: string;
}

// 使用type定义对象类型
type UserType = {
  id: number;
  name: string;
};

2. 扩展和合并

  • interface:支持声明合并(Declaration Merging),可以通过多次声明同名接口来扩展接口。
  • type:不支持声明合并,但可以通过交叉类型(&)来实现类似的效果。

示例:

// interface支持声明合并
interface Animal {
  name: string;
}

interface Animal {
  age: number;
}

// 合并后的Animal接口
// interface Animal {
//   name: string;
//   age: number;
// }

// type不支持声明合并,但可以使用交叉类型
type Car = {
  brand: string;
};

type Vehicle = Car & {
  wheels: number;
};

3. 复杂类型定义

  • interface:主要用于定义对象类型,但也可以用于定义函数类型。
  • type:可以用于定义更复杂的类型,包括联合类型、交叉类型、元组等。

示例:

// 使用interface定义函数类型
interface Greet {
  (name: string): string;
}

// 使用type定义函数类型
type GreetFunction = (name: string) => string;

// 使用type定义联合类型
type Status = "success" | "error" | "loading";

// 使用type定义元组
type Point = [number, number];

4. 实现和继承

  • interface:可以被类实现(implements),并且支持接口继承(extends)。
  • type:不能被类实现,但可以通过交叉类型实现类似的继承效果。

示例:

// interface实现和继承
interface Person {
  name: string;
}

interface Employee extends Person {
  employeeId: number;
}

class Developer implements Employee {
  name: string;
  employeeId: number;
  constructor(name: string, employeeId: number) {
    this.name = name;
    this.employeeId = employeeId;
  }
}

// type的交叉类型实现类似继承
type PersonType = {
  name: string;
};

type EmployeeType = PersonType & {
  employeeId: number;
};

5. 使用建议

  • interface:如果你主要是定义对象的结构,并且需要使用继承或声明合并,interface 是更好的选择。
  • type:如果你需要定义复杂类型(如联合类型、交叉类型、元组等),或者需要使用类型别名,type 会更合适。

总之,interfacetype 各有其优势和适用场景,选择哪一个主要取决于你的具体需求和代码风格。通常情况下,interface 用于定义对象结构,而 type 用于定义更复杂的类型。