TS中的接口interface 和 type语句有什么区别?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
}
在TypeScript中,interface
和type
语句都可以用来定义对象的形状或者类型别名。尽管它们在很多情况下可以互换使用,但它们之间存在一些关键的区别和适用场景。
interface
- 扩展性:
interface
更注重于定义对象的“形状”。接口可以通过extends
关键字被扩展,支持多个接口继承。这使得接口非常适合定义公共API的形状。 - 声明合并:如果同一个
interface
在同一作用域内被声明多次,它们会自动合并。这对于在不同文件中扩展已有接口特别有用。
interface X {
a: number;
}
interface X {
b: string;
}
// 自动合并为:interface X { a: number; b: string; }
type
- 类型别名:
type
声明可以用来给类型设置别名,不仅限于对象形状,还可以用于其他类型,如联合类型、交叉类型、基本类型等。 - 不可扩展:类型别名不能被扩展或实现(不像接口那样)。一旦定义了类型别名,就不能再修改它来添加新的属性或方法。
- 映射类型:
type
可以用来定义映射类型,这是一种根据旧类型创建新类型的方法,例如通过在旧类型的每个属性前添加readonly
修饰符来创建一个全新的类型。
type Y = {
a: number;
b: string;
};
// 映射类型示例
type ReadonlyY = Readonly<Y>;
示例中的区别
在你给出的例子中,使用interface
和type
定义了同样的结构X
。尽管结果相同,但是如果你打算扩展这个结构或者希望其他接口继承它,使用interface
是更好的选择。如果你的结构不需要扩展,并且可能会用到联合类型、交叉类型或其他高级类型特性,那么type
可能是更好的选择。
总结
- 使用
interface
来定义对象的形状,并且当你希望在声明文件中暴露一个API,或者需要其他接口来实现或扩展它时。 - 使用
type
来定义类型别名、联合类型、交叉类型等,或者当你需要使用映射类型时。 - 在实践中,推荐首先考虑使用
interface
,因为它更具扩展性。但在需要使用到type
的高级特性时,type
则是更好的选择。