类型别名类型首先,什么是类型别名?类型别名用于为类型赋予新名称。使用type创建类型别名。类型别名不仅可以用来表示基本类型,还可以用来表示对象类型、联合类型、元组和交集。让我们看一些例子:typeuserName=string;//原始类型typeuserId=string|数字;//联合类型arr=number[];//对象类型类型Person={id:userId;//可以使用类型名称定义:userName;年龄:数字;性别:字符串;isWebDev:boolean;};//通用类型Tree={value:T};constuser:Person={id:"901",name:"tsubaki",age:22,gender:"female",isWebDev:false,};常量数字:arr=[1,8,9];interfaceinterface接口是另一种命名数据结构(例如对象)的方式;与类型不同,接口仅限于描述对象类型。接口的声明语法也不同于类型别名。让我们将上面的类型别名Person重写为接口声明:interfacePerson{id:userId;姓名:用户名;年龄:数字;性别:字符串;isWebDev:boolean;}interface和type的相同点在两者的区别讨论之前,我们先来看看两者的相同点(为什么我们在开发的时候用同一个)Object和Function都可以用来描述对象或函数,但语法不同:TypetypePoint={x:number;y:number;};typeSetPoint=(x:number,y:number)=>void;InterfaceinterfacePoint{x:number;y:number;}interfaceSetPoint{(x:number,y:number):void;}两者都可以被继承。接口和类型都可以被继承。另一件值得注意的事情是接口和类型别名并不相互排斥。类型别名可以从接口继承,反之亦然。只是在实现形式上,略有不同。interface继承interfacePerson{name:string}interfaceStudentextendsPerson{stuNo:number}interface继承typetypePerson{name:string}interfaceStudentextendsPerson{stuNo:number}type继承typetypePerson{name:string}typeStudent=Person&{stuNo:number}type继承interfaceinterfacePerson{name:string}typeStudent=Person&{stuNo:number}implements类可以实现接口和类型(联合类型除外)接口ICat{setName(name:string):void;}classCatimplementsICat{setName(name:string):void{//todo}}//typetypeICat={setName(name:string):void;}classCatimplementsICat{setName(name:string):void}{//todo}}上面说的特例,类不能实现union类型,什么意思呢?类型Person={名称:字符串;}|{setName(name:string):void};//不能实现联合类型Person//错误:一个类只能实现一个对象类型或对象类型与静态已知成员的交集.classStudentimplementsPerson{name="张散”;设定名称(name:string):void{//todo}}我们在上面讨论了接口和类型之间的相似之处。接下来,让我们看看它们的区别。1.定义基本类型别名Type可以定义基本类型别名,但是不能定义Interface,如:typeuserName=stringtypestuNo=number...2.声明联合类型type可以声明联合类型,例如:typeStudent={stuNo:数字}|{classId:number}3.声明元组类型可以声明元组类型:typeData=[number,string];以上都可以通过类型来完成,但不能通过接口来完成。接下来说说type不能做什么。4.声明合并如果多次声明同名接口,TypeScript会将它们合并为一个声明,并将它们视为一个接口。这称为声明合并,例如:interfacePerson{name:string}interfacePerson{age:number}letuser:Person={name:"Tolu",age:0,};这种情况下,如果是type,重复使用Person会报错:typePerson{name:string};//错误:重复标识符“Person”。ts(2300)typePerson{age:number}5.Indexsignatureproblem如果你经常使用TypeScript,你一定遇到过类似的错误:Type'xxx'isnotassignabletotype'yyy'Indexsignatureismissingintype'xxx'。看一个例子来理解问题:interfacepropType{[key:string]:string}letprops:propTypetypedataType={title:string}interfacedataType1{title:string}constdata:dataType={title:"Orderpage"}constdata1:dataType1={title:"OrderPage"}props=data//错误:类型'dataType1'不可分配给类型'propType';indexsignatureismissingintype'dataType1'props=data1我们发现dataType和dataType1对应的类型相同,但是接口定义赋值失败。是什么原因?一开始我很疑惑,最后在stackoverflow:image.png上找到了一个类似的问题,幸运的找到了一个有效的答案:image.png的翻译大致意思是:Recordand{[key:string]:string}是一样的。仅当该类型的所有属性都是已知的并且可以根据该索引签名进行检查时,才允许将子集分配给索引签名类型。在您的情况下,从exampleType到Record的所有内容都是可分配的。这只能针对对象字面量类型进行检查,因为对象字面量类型一旦声明就无法更改。因此,索引签名是已知的。相反,当您使用接口声明变量时,它们的类型在那一刻不是最终的。由于interfac可以执行声明合并,因此始终可以向同一接口定义的类型添加新成员。重组