简述TypeScript 中 interface 和 type 的差别是什么?
在TypeScript中,interface
和type
都可以用来定义对象的形状或其他类型别名,但它们在某些方面有不同的用途和限制。理解它们的区别有助于在合适的场景中选择合适的工具。
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"; // 或者可以是一个数字
总结
虽然interface
和type
在很多情况下都可以互换使用,但它们各自都有特定的使用场景。interface
更适合定义对象的形状和实现面向对象的编程模式,而type
则在定义复杂的类型结构或需要使用联合、交叉类型时更加有用。正确选择interface
和type
可以使你的TypeScript代码更加清晰和易于维护。