loading

TS - type、interface

type

type 可以看作是一个类型盘子,在一个很大一截、很大一串的类型运算之后,这个结果存储到哪里?这一大串类型运算怎么用?总得需要一个“东西”来存储,类似于变量。如下所示:

type Partial<T> = { [P in keyof T]?: T[P] | undefined; }

这是一个可以把对象第一层的属性转换为可选的类型别名。TS 官方文档提供的线上代码

我们可以把 { [P in keyof T]?: T[P] | undefined; } 这一串给到一个函数参数上,也可以把这一坨给到一个函数返回值上,但是太长了,不方便使用,于是把这一坨给到一个 type 声明的类型别名,所以,我认为它就是一个类型盘子,装“东西”用的。

interface

下面是 interface 的官方文档说明:

An interface declaration is another way to name an object type.

interface 中的 extends 是继承的意思,接口可以继承其他接口,扩展对象类型属性。type 既可以声明对象类型,又可以做类型运算,最终得到的类型可能是一个基础类型(string、number 之类的),也可能是函数类型,或者其他,而 interface 的结果只可能是一个对象类型,是来约束(预期)某个对象的属性是什么样子的。

如下所示,type 的对象类型和 interface 的对象类型可以交叉(&)起来:

type Colorful = {
  color: string;
}

interface Circle {
  radius: number;
}

type ColorfulCircle = Colorful & Circle;

如下所示,接口可以继承(扩展) type 的对象类型:

type Colorful = {
  color: string;
}

interface Circle extends Colorful {
  radius: number;
}

tip:[start]接口可以继承 type 的对象类型,但是不能让 type 继承接口,因为在 type 中,extends 是一个条件类型,而非继承的意思。tip:[end]

所以,typeinterface 在不同场景,有不同的作用。

posted @ 2023-04-15 19:29  Himmelbleu  阅读(37)  评论(0编辑  收藏  举报