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

与TypeScript的常见混淆:接口和类型有什么区别?

时间:2023-03-12 16:47:07 科技观察

我们在使用TypeScript的时候,会用到接口和类型。通常,我们觉得它们的用法好像是一样的,没有什么区别,都可以很好的使用,所以很少真正去了解它们之间的关系。有什么不同。我们经常开发或定义这样的类型:interfacePoint{x:number;y:number;我们在使用TypeScript的时候,会用到`interface`和`type`,通常感觉它们的用法好像是一样的,没有什么区别,都可以很好的使用,所以很少能真正理解它们的区别.我们经常开发定义这样的类型:interfacePoint{x:number;y:number;}或者像这样:typePoint={x:number;y:number;};`interface`和`type`之间的区别不仅仅是次要的语法声明。那么,今天我们就来看看这两个家伙之间的不可告人的秘密吧。###类型和类型别名TypeScript有`boolean`、`number`、`string`等基本类型,如果我们要声明高级类型,就需要使用**类型别名**。类型别名是指为类型创建新名称。**需要注意的是**,我们并没有定义一个新的类型。使用`type`关键字可能会让我们觉得我们正在创建一个新类型,但我们只是给一个类型一个新名称。所以当我们键入时,我们不是在创建一个新的类别,而是定义一个类型的别名。###接口与`type`相反,接口仅限于对象类型。它们是描述对象及其属性的一种方式。类型别名声明可用于任何基本类型、联合或交集。**在这方面,接口仅限于对象类型**。###接口和类型的相同点在讨论它们的不同点之前,我们先来看看它们的相同点。}或这样定义:typePoint={x:number;y:number;};接口和类型之间的区别不仅仅是次要的语法声明。那么,今天我们就来看看这两个家伙之间的不可告人的秘密吧。类型和类型别名TypeScript有boolean、number、string等基本类型,如果我们要声明高级类型,就需要使用类型别名。类型别名是指为类型创建新名称。请注意,我们没有定义新类型。使用type关键字可能会让我们觉得我们正在创建一个新类型,但我们只是给一个类型一个新名称。所以当我们键入时,我们不是在创建一个新的类别,而是定义一个类型的别名。接口与类型相反,接口仅限于对象类型。它们是描述对象及其属性的一种方式。类型别名声明可用于任何原始类型、联合或交集。在这方面,接口仅限于对象类型。接口和类型之间的相似之处在讨论它们的区别之前,让我们先看看它们的相似之处。既可以继承接口,也可以继承类型。另一件值得注意的事情是接口和类型别名并不相互排斥。类型别名可以从接口继承,反之亦然。对于接口,继承另一个接口interfacePartialPointX{x:number;}interfacePointextendsPartialPointX{y:number;}或者,继承一个类型typePartialPointX={x:number;};interfacePointextendsPartialPointX{y:number;}Type继承另一个类型:typePartialPointX={x:number;};typePoint=PartialPointX&{y:number;};或者,继承一个接口:interfacePartialPointX{x:number;}typePoint=PartialPointX&{y:number;};实现类可以实现接口和类型(TS2.7+)。但是,类不能实现联合类型。interfacePoint{x:number;y:number;}classSomePointimplementsPoint{x=1;y=2;}typeAnotherPoint={x:number;y:number;};classSomePoint2implementsAnotherPoint{x=1;y=2;}typePartialPoint={x:number;}|{y:number;};//下面的willthrowanerrorclassSomePartialPointimplementsPartialPoint{x=1;y=2;}接口和类型的区别联合和交集类型接口虽然可以扩展和合并,但是不能组合和相交形式合并。类型可以使用联合和交集运算符来形成新类型。//objecttypePartialPointX={x:number;};typePartialPointY={y:number;};//uniontypePartialPoint=PartialPointX|PartialPointY;//intersectiontypePartialPoint=PartialPointX&PartialPointY;语句mergeTypeScript编译器合并两个或多个具有相同名称的接口。这不适用于类型。如果我们尝试创建两个名称相同但属性不同的类型,TypeScript编译器将抛出错误。//这组声明变为://interfacePoint{x:number;y:number;}interfacePoint{x:number;}interfacePoint{y:number;}constpoint:Point={x:1,y:2};元组类型元组(键值对)只能用type关键字定义。typePoint=[x:number,y:number];无法使用接口声明元组。但是,我们可以在界面内部使用元组interfacePoint{coordinates:[number,number]}。我们应该使用哪一个?通常,接口和类型非常相似。对于库中的公共API定义或第三方类型定义,应使用接口来提供声明合并功能。除此之外,我们可以使用任何我们喜欢的,但它应该在整个代码库中保持一致。~完了,我是小智。作者:SARANSHKATARIA译者:前端小智来源:wisdomgeek原文:https://www.wisdomgeek.com/development/web-development/typescript/typescript-the-difference-between-interface-and-type/