Loading

TS 中 type 和 interface 的区别

概念

interface 接口

接口主要用于类型检查,它只是一个结构契约,定义了具有相似的名称和类型的对象结构。除此之外,接口还可以定义方法和事件。

type (alias)类型别名

不同于 interface 只能定义对象类型,type 声明还可以定义基础类型、联合类型或交叉类型。

差异点

1. 定义类型的范围

interface 只能定义对象类型, 而 type 声明可以声明任何类型,包括基础类型、联合类型或交叉类型。

  • 基本类型
type Person = string;
  • 联合类型
interface Dog {
  name: string;
}
interface Cat {
  age: number;
}
type animal = Dog | Cat;
  • 元组
interface Dog {
  name: string;
}
interface Cat {
  age: number;
}
type animal = [Dog, Cat];

2. 扩展性

接口可以 extends、implements,从而扩展多个接口或类。类型没有扩展功能,只能交叉合并。

  • interface extends interface
interface Person {
  name: string;
}
interface User extends Person {
  age: number;
}
  • interface extends type
type Person = { name: string };
interface User extends Person {
  age: number;
}

type 使用交叉类型&来合并不同成员的类型

  • type & type
type Person = { name: string };
type User = Person & { age: number };
  • type & interface
interface Person {
  name: string;
}
type User = { age: number } & Person;

3. 合并声明

定义两个相同名称的接口会合并声明,定义两个同名的 type 会出现异常。

interface Person {
  name: string;
}
interface Person {
  age: number;
}
// 合并为:interface Person { name: string age: number}

type User = {
  name: string;
};
type User = {
  age: number;
};
// 声明重复报错:标识符“User”重复。

4. type 可以获取 typeof 返回的值作为类型

let div = document.createElement("div");
type B = typeof div; // HTMLDivElement
posted @ 2021-05-18 15:10  Frank-Link  阅读(5512)  评论(0编辑  收藏  举报