在 TypeScript 中,interface
和 type
都可以用来定义对象类型,但它们有一些关键区别:
主要区别
1.扩展方式不同:
interface
使用extends
继承type
使用&
交叉类型
// interface 扩展
interface A { x: number }
interface B extends A { y: string }
// type 扩展
type C = { x: number }
type D = C & { y: string }
2.合并声明:
interface
可以重复声明并自动合并type
不能重复声明
interface User { name: string }
interface User { age: number }
// 最终 User 是 { name: string; age: number }
type Person = { name: string }
type Person = { age: number } // 错误: 重复标识符 'Person'
3.类型表达式:
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]
在实际开发中,两者可以混合使用,根据具体场景选择更合适的工具。