在 TypeScript 中,interface 和 type 都可以用来定义对象类型,但它们有一些关键区别:
主要区别
-
扩展方式不同:
interface使用extends继承type使用&交叉类型
// interface 扩展 interface A { x: number } interface B extends A { y: string } // type 扩展 type C = { x: number } type D = C & { y: string } -
合并声明:
interface可以重复声明并自动合并type不能重复声明
interface User { name: string } interface User { age: number } // 最终 User 是 { name: string; age: number } type Person = { name: string } type Person = { age: number } // 错误: 重复标识符 'Person' -
类型表达式:
type可以使用更复杂的类型表达式interface只能用于对象类型
type StringOrNumber = string | number type Tuple = [string, number]
使用建议
-
**优先使用
interface**:- 定义对象类型时
- 需要声明合并时
- 需要被类实现时
-
**使用
type**:- 需要联合类型、元组类型时
- 需要类型映射、条件类型等高级特性时
- 需要定义基本类型别名时
示例对比
// 使用 interface
interface Point {
x: number
y: number
}
interface Point3D extends Point {
z: number
}
// 使用 type
type PointType = {
x: number
y: number
}
type Point3DType = PointType & {
z: number
}
// 只有 type 可以做的
type ID = string | number
type Coordinates = [number, number]
在实际开发中,两者可以混合使用,根据具体场景选择更合适的工具。