TS中的接口interface 和 type语句有什么区别?

interface X {
a: number
b: string
}
type X = {
a: number
b: string
}

在TypeScript中,interfacetype语句都可以用来定义对象的形状或者类型别名。尽管它们在很多情况下可以互换使用,但它们之间存在一些关键的区别和适用场景。

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>;

示例中的区别

在你给出的例子中,使用interfacetype定义了同样的结构X。尽管结果相同,但是如果你打算扩展这个结构或者希望其他接口继承它,使用interface是更好的选择。如果你的结构不需要扩展,并且可能会用到联合类型、交叉类型或其他高级类型特性,那么type可能是更好的选择。

总结

  • 使用interface来定义对象的形状,并且当你希望在声明文件中暴露一个API,或者需要其他接口来实现或扩展它时。
  • 使用type来定义类型别名、联合类型、交叉类型等,或者当你需要使用映射类型时。
  • 在实践中,推荐首先考虑使用interface,因为它更具扩展性。但在需要使用到type的高级特性时,type则是更好的选择。

发表评论

后才能评论