简述TypeScript 中 interface 和 type 的差别是什么?

在TypeScript中,interfacetype都可以用来定义对象的形状或其他类型别名,但它们在某些方面有不同的用途和限制。理解它们的区别有助于在合适的场景中选择合适的工具。

Interface(接口)

  • 扩展性interface更适用于声明对象的形状,它支持扩展和继承。你可以通过extends关键字扩展一个或多个接口,也可以实现接口继承。
  • 合并声明:如果你在同一个作用域下多次声明同一个interface,TypeScript会将它们自动合并为一个接口。
  • 主要用途:主要用于定义对象的形状,以及在面向对象编程中定义类的契约。

Type(类型别名)

  • 多样性type提供了一种声明任意类型的方法,包括基本类型、联合类型、交叉类型、元组等。它比interface更加灵活。
  • 不可扩展type声明不能像interface那样被扩展或实现(虽然你可以通过交叉类型来间接“扩展”它们)。
  • 主要用途:用于定义类型别名、联合类型、交叉类型等复杂的类型结构。

Interface vs Type

特性/用途 Interface Type
对象形状 ✅ 支持 ✅ 支持
扩展/继承 ✅ 支持(通过extends ⚠️ 间接支持(通过交叉类型)
联合类型 ❌ 不支持 ✅ 支持
交叉类型 ❌ 不支持 ✅ 支持
元组和其他类型 ❌ 不支持 ✅ 支持
声明合并 ✅ 支持 ❌ 不支持

示例

Interface 扩展

interface Animal {
    name: string;
}

interface Bear extends Animal {
    honey: boolean;
}

const bear: Bear = { name: "Winnie", honey: true };

Type 联合和交叉

type Animal = {
    name: string;
}

type Bear = Animal & { 
    honey: boolean;
};

type StringOrNumber = string | number;

const bear: Bear = { name: "Winnie", honey: true };
const id: StringOrNumber = "1234"; // 或者可以是一个数字

总结

虽然interfacetype在很多情况下都可以互换使用,但它们各自都有特定的使用场景。interface更适合定义对象的形状和实现面向对象的编程模式,而type则在定义复杂的类型结构或需要使用联合、交叉类型时更加有用。正确选择interfacetype可以使你的TypeScript代码更加清晰和易于维护。

发表评论

后才能评论