TypeScript 中的 type
和 interface
都是用来定义类型的工具,它们之间有很多相似之处,但也有一些关键的区别:
-
声明合并(Declaration Merging):
interface
支持声明合并,也就是说,同一个接口名称可以在不同文件中多次声明,TypeScript 会将它们合并为一个接口。这对于大型项目中拆分接口定义非常有用。type
不支持声明合并,如果有两个同名的类型别名定义,会导致编译错误。
-
扩展(Extending):
interface
可以通过extends
关键字实现继承和扩展其他接口。type
通过类型别名的交叉类型(intersection type)语法&
实现类似的效果,例如type NewType = ExistingType & AnotherType
。
-
原始类型别名:
type
可以定义基本类型(primitive type)的别名,如type MyNumber = number
,还可以定义联合类型、元组类型等复杂类型。interface
不能直接定义基本类型的别名。
-
映射类型(Mapped Types):
type
可以使用in
关键字创建映射类型,可以基于现有类型创建新类型,例如创建带有可选属性的新类型。interface
不能直接创建映射类型。
-
匿名类型:
type
可以定义匿名类型,如type AnonType = { name: string, age: number }
,而不需要为类型别名命名。interface
必须始终命名。
总的来说,在大多数情况下,type
和 interface
可以互换使用,尤其是在描述对象结构的时候。但在需要声明合并、映射类型等特性时,必须使用 type
。在设计项目时,可以根据需要选择合适的类型定义方式。在最新的 TypeScript 版本中,很多原本只能通过 type
实现的功能也逐渐能在 interface
上使用,两者之间的差异在减少。