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]
所以,type
和 interface
在不同场景,有不同的作用。