Typescript接口和类之间有什么区别?什么时候使用班级?什么时候使用接口?它们的优点是什么?
我需要为后端服务器的HTTP请求创建某种类型的内容(使用Angular 2进行此操作),例如:},
"fields": {
"project": {
"id": "10000"
},
"summary": "something's wrong",
"issuetype": {
"id": "10000"
},
"assignee": { // not neccesary required
"name": "homer"
},
"reporter": {
"name": "smithers"
},
"priority": { // not neccesary required
"id": "20000"
}
}
我应该使用什么来构建这些模型?谢谢!
首先,有一个明显的区别:语法。这是一个简单但需要理解的区别:接口属性可以以逗号或分号结尾,而类属性只能以分号结尾。现在有趣的东西。关于何时使用和不使用的部分可能是主观的-这些是我为团队成员提供的准则,但是出于有效的原因,其他团队也可能会有其他准则。如果您的团队有其他不同的想法,请随时发表评论,我很想知道为什么。
接口:允许定义在设计和编译期间用于强类型化的类型。它们可以“实现”或“扩展”,但不能实例化(您不能new
这样做)。在向下编译为JS时它们会被删除,因此它们不占用空间,但是在运行时也无法对其进行类型检查,因此您无法检查变量是否在运行时实现了特定类型(例如foo instanceof bar
),除非检查其属性。具有:使用Typescript进行接口类型检查。
何时使用接口:当需要为对象创建属性和函数的协定时,可以使用它们,这些约定将在代码中的多个地方使用,尤其是在多个文件或函数中。此外,当您希望其他对象开始的这组基本特性,如具有的使用Vehicle
接口,多个类实现具体类型的车辆,如Car
,Truck
,Boat
(例如class Car implements Vehicle
)。
何时不使用接口:当您想要具有默认值,实现,构造函数或函数(而不仅仅是签名)时。
类:还允许定义一种类型,该类型将在设计和编译时用于强类型化,并且可以在运行时使用。这也意味着代码没有被编译出来,因此会占用空间。这是@Sakuto提到的一个关键区别,但它的含义不只是空间。这意味着可以对类进行类型检查,即使在已转译的JS代码中也可以保留对“它们是谁”的理解。进一步的区别包括:类可以使用实例化new
,可以扩展,但不能实现。类可以具有构造函数和实际功能代码以及默认值。
何时使用类:当您要创建其中包含实际功能代码的对象时,请使用构造函数进行初始化,和/或使用来创建其实例new
。另外,对于简单的数据对象,您可以使用类来设置默认值。另一个您想使用它们的时间是在进行类型检查时,但是如果需要,可以使用一些接口的解决方法(请参阅接口部分的OS链接)。
什么时候不使用类:当您有一个简单的数据接口时,不需要实例化它;当您希望由其他对象实现它时;当您只需将接口放在现有对象上时(请考虑类型定义文件)或占用空间过大或不必要的情况。附带说明一下,如果您查看.d.ts文件,您会发现它们仅使用接口和类型,因此在转换为TS时将完全删除该接口和类型。
最后要注意的是,除了类和接口之外,还有其他两个选项,第一个是称为“类型”的东西,它与接口非常相似,但请查看此SO帖子,特别是2019 Update答案:Typescript:Interfaces vs Types。最后一个选择是使用TS进行函数式编程(不是OOP)。
有关示例的完整故事,请访问PassionForDev.com,有关示例与继承的更多关于类与继承的良好阅读,请访问https://jameshenry.blog/typescript-classes-vs-interfaces/。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句