You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Type aliases and interfaces are very similar, and in many cases you can choose between them freely. Almost all features of an interface are available in type, the key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable.
// 接口扩展interfaceSisterAn{name: string;age: string}interfaceSisterextendsSisterAn{name: string;age: number;}// 报错:// Interface 'Sister' incorrectly extends interface 'SisterAn'.// Types of property 'age' are incompatible.// Type 'number' is not assignable to type 'string'
interfaceSister{name: string;}interfaceSister{age: number;}constsisterAn: Sister={name: 'sisterAn'}// 报错:Property 'age' is missing in type '{ name: string; }' but required in type 'Sister'constsisterRan: Sister={name: 'sisterRan',age: 12}// 正确
// 接口扩展interfaceSister{sex: number;}interfaceSisterAnextendsSister{sex: string;}// index.ts(5,11): error TS2430: Interface 'SisterAn' incorrectly extends interface 'Sister'.// Types of property 'sex' are incompatible.// Type 'string' is not assignable to type 'number'.
// 交叉类型typeSister1={sex: number;}typeSister2={sex: string;}typeSisterAn=Sister1&Sister2;// 不报错,此时的 SisterAn 是一个'number & string'类型,也就是 never
The text was updated successfully, but these errors were encountered:
接口 与 类型别名 的异同点
相同点
1. 都可以描述对象或函数
2. 都可以扩展
interface
和type
可以混合扩展,也就是说interface
可以扩展type
,type
也可以扩展interface
。但需要注意的是,接口的扩展是继承(
extends
)。类型别名的扩展就是交叉类型(通过&
实现)区别
官方 中这样介绍两者的区别:
意思就是说几乎接口的所有特性都可以通过类型别名来实现,主要区别在于:
1. 不同的声明范围
与接口不同,可以为任意的类型创建类型别名
类型别名的右边可以是任何类型,包括基本类型、元祖、类型表达式(
&
或|
等);而在接口声明中,右边必须为变量结构。例如,下面的类型别名就不能转换成接口2. 不同的扩展形式
接口是通过继承的方式来扩展,类型别名是通过
&
来扩展这里需要注意的是,接口扩展时,typescript 会检查扩展的接口是否可以赋值给被扩展的接口
但使用交集类型时就不会出现这种情况
类型别名扩展时,typescript 将尽其所能把扩展和被扩展的类型组合在一起,而不会抛出编译时错误
3. 不同的重复定义表现形式
接口可以定义多次,多次的声明会自动合并
但是类型别名如果定义多次,会报错
如何选择 Interface 、 Type
虽然 官方 中说几乎接口的所有特性都可以通过类型别名来实现,但建议优先选择接口,接口满足不了再使用类型别名,在 typescript 官网 Preferring Interfaces Over Intersections 有说明,具体内容如下:
简单的说,接口更加符合 JavaScript 对象的工作方式,简单的说明下,当出现属性冲突时:
The text was updated successfully, but these errors were encountered: