彻底搞懂interface与type区别

277 阅读4分钟

TypeScript学习过程中,有个问题会一直困扰我们,那就是interface接口类型与type类型别名的区别。本文希望通过通俗易懂的语言,彻底搞懂这个知识点。

一 概念理解

我们先来分析一下interfacetype这两位大佬出现的背景及基本定义。

1.1 interface

使用TypeScript进行开发,经常需要对一些对象进行类型定义。

let jack = {
  name: "jack",
  age: 18,
};

那么,jack这个变量的类型是什么呢?在vscode中,我们可以将鼠标直接移到变量处。

image.png

那么对于变量jack,我们改如何显示的申明类型呢。

首先我们可以参考类型推断的结果,直接使用内联接口方式。

let jack: { name: string; age: number } = {
  name: "jack",
  age: 18,
};

但是,对于一个内联的接口,我们没法做到类型的复用。我们在定义其他结构类似的变量的时候,无法使用这个类型。所以我们可以使用interface关键字来显示定义接口类型.

interface IPerson {
  name: string;
  age: number;
}

let jack: IPerson = {
  name: "jack",
  age: 18,
};

let nancy: IPerson = {
  name: "nancy",
  age: 16,
};

通过interface来定义显示定义接口类型,我们就可以实现类型的复用,一方便可以节约开发的成本,另一方便还可以借助extends关键字来扩充我们的接口。

1.2 type

type关键字是类型别名的意思。看似一个简单的解释,但是所代表的含义,我确实花了很长时间才能够理解。
在TypeScript中,我们可以多个数据类型进行组合,例如使用|&关键字定义联合类型,交叉类型,也可以使用一些特定的语法,来实现自己的PartialOmit等。那么对于这种各种方式组合形成的类型,我们当然可以直接通过内联的方式直接使用,但我们肯定还需要考虑类型复用的问题。interface大佬肯定是解决不了这个问题了,那么就需要请出我们另外一个大佬来帮忙了,就是type

对于那些组合得到的类型,我们可以认为是「自定义类型」,这些类型要实现复用,我们就需要对我们的自定义类型进行命名,而命名的操作,就是通过type关键词是实现的。

type IParam = string | number;

let param: IParam = "ts";

通过以上的解释,我们应该很好理解什么是类型别名这个概念了。
看到这里,相信大家对这两个关键字已经没那么混淆了。那么接下来,我们再深入学习下。

二 interface

interface涉及到的知识点里面,「可选属性」、「只读属性」这些基本的概念就不在具体展开了。

2.1 索引签名

我们在定义一些变量时,往往其中的属性和方法是固定的,但有时也到不固定的场景,我们不清楚有哪些属性,但是这些属性的类型是知道的。对于这种场景,我们就可以使用「索引签名」。

interface IPerson {
  [name: string]: string;
}

let jack: IPerson = {
  name: "jack",
  hobby: "basketball",
};

我们定义的索引名对应的类型是string,索引对应的类型也是string

image.png

2.2 extends

2.2.1 接口继承

接口之间是可以使用extends关键字来实现继承的。

interface IBase {
  hobby: string;
}

interface IPerson extends IBase {
  name: string;
  age: number;
}

image.png

2.2.2 属性不兼容

在继承的过程,如果出现同名属性,并且属性「不兼容」,就会报错。

image.png

三 type

3.1 类型别名

type关键字是类型别名,在自定义类型中,我们将各个类型进行组合,也可以就单个基本类型进行命名.

type baseString = string;
let param: baseString = "hello";

3.2 类型扩充

interface大佬可以使用extends关键字来扩充属性,type没有现成的关键字,但是可以使用&进行交叉,来曲线救国。

image.png

类型交叉的过程,如果出现同名属性,并且类型不兼容时,不会报错,整个类型会被定义为never

image.png

四、结论

总的来说,type可以通过给自定义类型命名的方式,适用于任何场景,功能面最广。interface通常适用于对象的定义。