大家好,我是前端西瓜哥。今天我们就来看看类型和接口的区别。type和interfacetype是类型别名,为一些类型的组合起别名,以便更方便的在各个地方使用。假设在我们的业务中,id可以是一个字符串,也可以是一个数字,那么我们可以定义这样一个名为ID的类型:typeID=string|数字;定义一个名为Circle的对象结构类型:typeCircle={x:number;y:数字;半径:数字;}interface是接口。有点像类型,可以用来表示类型的组合,但是范围更小,只能描述对象结构。接口位置{x:数字;y:number;}写法有点不一样,type后面要用=,interface后面不用=,只要放{.可以由范围类型表示的类型的任意组合。接口只能表示对象结构的类型。继承接口可以继承(扩展)另一个接口。在下面的代码中,Rect继承了Shape的属性,并在此基础上增加了width和height属性。界面形状{x:数字;y:number;}//继承扩展接口RectextendsShape{width:number;height:number;}constrect:Rect={x:0,y:0,width:0,height:0};interface也可以继承type,但只能是一个对象结构,或者是多个type对象形成交集类型(&)。我们来看看类型的继承能力。type可以通过写&来继承类型或接口,得到一个交叉类型:typeShape={x:number;y:number;}typeCircle=Shape&{r:number}constcircle:Circle={x:0,y:0,r:8}声明合并接口支持声明合并,文件下多个同名接口,他们的属性将被合并。接口点{x:数字;}接口点{y:数字;}常量点:点={x:10,y:30};需要注意的是,同名属性不能被覆盖修改,否则编译不通过。比如我先声明属性x的类型是number,然后你声明属性x的类型是string|numberbr,如下图,编译会报错。interfacePoint{x:number;}interfacePoint{//错误//属性'x'必须是'number'类型,但这里的类型是'string|数字'。x:字符串|数字;y:number;}extends可以缩小属性的类型,比如fromstring|数字到字符串。但是声明合并不起作用,类型必须完全相同。类型不支持声明合并,同一个作用域内不允许存在多个同名类型。//Error:Duplicateidentifier'Point'.typePoint={x:number;}//Error:Duplicateidentifier'Point'.typePoint={y:number;}当然如果有同名接口作为类型,它也会出错。最后总结一下,type和interface的区别是:type后面有=,但是没有interface。类型可以描述任意类型的组合,而接口只能描述对象结构。接口可以继承(扩展)接口或对象结构类型。type也可以通过&继承object结构。多个声明的同名接口将被合并,而多个声明的类型是不允许的。大多数情况下,我更喜欢使用interface,因为这样扩展起来会更方便,提示也更友好。&真的很难用。
