当前位置: 首页 > 科技观察

接口和类型有什么区别?你知道吗?

时间:2023-03-21 01:44:05 科技观察

1。写在前面我们在使用TypeScript的时候,会用interface和type来描述对象的形状和结构。平时感觉他们的用法好像都一样,好像没什么区别。这两个概念对于大多数人来说还是有点混淆的,那么本文将带领大家看看它们的异同。2.interface和typeinterface用于描述对象的形状和结构,可以为数据添加类型,方便复用。类型是通过别名重新定义类型,类型别名是指为类型创建一个新的名字。应该注意的是,我们还没有定义新类型。两者都是两种不同形式的接口定义,目的都是为了定义对象的形状和结构。不过两者还是有一些区别的:接口和类型都可以扩展,接口可以扩展类型,但是类型不能继承接口类可以用同样的方式实现(implements)接口或类型别名,但是类不能实现定义使用类型别名联合类型。类型可以使用联合类型和交集,接口不能使用联合类型和交集复合类型别名声明可以用于任何原始类型、联合或交集。在这方面,接口仅限于对象类型和函数签名。接口可以实现声明合并,类型不能实现声明合并用接口和类型来描述一个对象的形状和结构。interfaceISum{(num1:number,num2:number):number}constsum:ISum=(num1,num2)=>{returnnum1+num2}typeTSum=(num1:number,num2:number)=>numberconstsum2:TSum=(num1,num2)=>{returnnum1+num2}如果有联合类型,则使用type。interfaceIUser{name:stringage:number}interfaceIStudent{university:string}//错误:无法使用联合类型的接口,没有接口IPerson=IUser|IStudent;类型TPerson=IUser|我是学生;type可以使用jointtype和Intersection,interface不能使用uniontype和intersection组合。typeTPersonA={name:string}typeTPersonB={age:number}//intersectiontypePartialPerson=TPersonA&TPersonB;//联合类型typePartialPerson=TPersonA|T人B;接口的特性没有在接口上定义,可以使用以下方法声明:(1)使用类型断言接口IPerson{name:string;age:number;}constpingping:IPerson={name:"pingping",age:18,address:"Beijing"}asIPerson(2)可以使用继承接口IPerson{name:string;age:number;}interfaceIUserextendsIPerson{address:string}constpingping:IUser={name:"pingping",age:18,address:"Beijing"}(3)可以使用可选类型interfaceIPerson{name:string;年龄:数字;address?:string;}constpingping:IPerson={name:"pingping",age:18,address:"Beijing"}(4)可以使用Indexable接口interfaceIPerson{name:string;年龄:数字;[key:string]:any;}constpingping:IPerson={name:"pingping",age:18,address:"Beijing"}接口和类型都可以Extended,接口可以扩展类型,但是类型不能继承接口,类型可以使用&联合类型来实现类似的功能。接口IPerson{name:stringage:number}typeTPerson={name:stringage:number}interfaceIStudentextendsIPerson{university:string}interfaceIStudentextendsTPerson{university:string}typeTStudent=TPerson&{university:string}typeTStudent=IPerson&{university:string}类可以用同样的方式实现(implements)接口或类型别名,但是类不能实现使用类型别名定义的联合类型。interfaceIPerson{name:stringage:number}classUserimplementsIPerson{name="pingping";age=18;}typeTPerson={name:stringage:number};classUserimplementsTPerson{name="pingping";age=18;}typePartialPerson={name:string}|{age:number};//一个类只能实现一个对象类型或//对象类型与静态已知成员的交集。classSomePartialPersonimplementsPartialPerson{//Errorname="pingping";age=18;}interface可以实现statement合并,type不能。interfaceIPerson{name:string}interfaceIPerson{age:number}constuser:IPerson={name:"pingping",age:18}类型别名声明可用于任何原始类型、并集或交集。在这方面,接口仅限于对象类型和函数签名。输入TPerson=[姓名:字符串,年龄:数字];我们无法使用接口来声明元组。但是,我们可以在接口内部使用元组接口IPerson{user:[name:string,age:number]}。3.参考文章《使用 TypeScript 常见困惑:interface 和 type 的区别是什么?》《一份不可多得的 TS 学习指南(1.8W字)》《type和interface的区别知多少?》4。用typescript写在最后,还是有很多容易混淆的概念,Interface和type是最典型的,目的是实现对象的类型和结构定义,但是有一些区别。对于使用建议,库中的公共API定义或第三方类型定义应使用接口来提供声明合并功能。除此之外,是否使用它取决于您,但请尽量在整个代码库中保持一致。