自动摘要
正在生成中……
在 TypeScript 中,构建类型有两种主要方式:使用 interface
和使用 type
。这两种方式有相似之处,也有不同之处。
interface
通常用于定义对象的形状,可以很容易地通过扩展(使用 extends
)来组合。一个类型别名 type
可以用来定义不仅是对象形状,还可以是其他 JavaScript 类型(如原始类型、联合类型、元组等)的类型。
接口(Interfaces):
- 可以被扩展和实现(implements);
- 用于定义对象的形状或类的公共接口;
- 能自动合并声明(如两个同名接口会被合并为单一接口)。
类型别名(Type aliases):
- 不能被扩展和实现,但可以使用交叉类型来组合其他类型(使用
&
);
- 可以用来定义更广泛的类型,比如联合类型、交叉类型、原始类型等;
- 不会自动合并声明,且在错误提示中可能不如接口清晰。
例子使用
interface
:
interface User {
name: string;
age: number;
}
// 扩展接口
interface Admin extends User {
privileges: string[];
}
例子使用 type
:
type User = {
name: string;
age: number;
};
// 组合类型
type Admin = User & {
privileges: string[];
};
// 使用类型别名定义联合类型
type Status = 'active' | 'inactive' | 'suspended';
在很多情况下,两者可以互换使用,但是在需要使用具体的语言特性时(例如接口的声明合并),选择就很明显了。而在其他情况下,例如定义联合类型或者元组类型时,只能使用 type
。