第213题:TypeScript 中 Interface 与 Type 的区别?在写 TypeScript 的时候,该用哪个比较好?
interface 接口只声明成员方法,不做实现。是一种描述对象或函数的东西。你可以把它理解为形状,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数组应该是什么样子的,一个类和继承类需要符合什么样的描述等等。下文分七个部分,一起看一下对象接口、函数接口、可索引类型接口、类接口是如何定义的,以及接口的继承、定义混合类型的接口和继承类的接口是如何使用的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
接口 与 类型别名 的异同点
相同点
1. 都可以描述对象或函数
2. 都可以扩展
interface
和type
可以混合扩展,也就是说interface
可以扩展type
,type
也可以扩展interface
。但需要注意的是,接口的扩展是继承(
extends
)。类型别名的扩展就是交叉类型(通过&
实现)区别
官方 中这样介绍两者的区别:
意思就是说几乎接口的所有特性都可以通过类型别名来实现,主要区别在于:
1. 不同的声明范围
与接口不同,可以为任意的类型创建类型别名
类型别名的右边可以是任何类型,包括基本类型、元祖、类型表达式(
&
或|
等);而在接口声明中,右边必须为变量结构。例如,下面的类型别名就不能转换成接口2. 不同的扩展形式
接口是通过继承的方式来扩展,类型别名是通过
&
来扩展这里需要注意的是,接口扩展时,typescript 会检查扩展的接口是否可以赋值给被扩展的接口
但使用交集类型时就不会出现这种情况
类型别名扩展时,typescript 将尽其所能把扩展和被扩展的类型组合在一起,而不会抛出编译时错误
3. 不同的重复定义表现形式
接口可以定义多次,多次的声明会自动合并
但是类型别名如果定义多次,会报错
如何选择 Interface 、 Type
虽然 官方 中说几乎接口的所有特性都可以通过类型别名来实现,但建议优先选择接口,接口满足不了再使用类型别名,在 typescript 官网 Preferring Interfaces Over Intersections 有说明,具体内容如下:
简单的说,接口更加符合 JavaScript 对象的工作方式,简单的说明下,当出现属性冲突时:
原文
参考: Differences Between Type Aliases and Interfaces
查看整理链接