为角度服务创建接口与导出服务类并将其用于类型信息有什么好处?
示例:
class Dashboard {
constructor(ui: IUiService){}
}
VS
class Dashboard {
constructor(ui: UiService){}
}
是否有性能优势?如果我只使用服务类来获取类型信息会发生什么?
除非您拥有可以使用但具有共同基础的服务的不同实现,否则它似乎是没有任何好处的额外工作。或者,当您想要在单元测试中模拟服务而不是直接使用它们时。
编辑:我很想知道打字稿编译器将对仅用于类型信息的导入做什么。它会调用构造函数还是添加到require语句(ES6)?它会新建一个类的实例吗?
答案 0 :(得分:5)
这不是一个TypeScript问题,这是一个"什么是适合" (简而言之)答案是:客户不应该知道"什么是所请求服务的真正实现。 今天你的UiService足以满足你的需求,但有一天你可能会有另外一个实现,甚至你想在你的测试中嘲笑它。
另一种情况是,UiService是由整个系统的ProUiService扩展的,你不得不遍布你的系统并改变注入的类型,而不是真正需要它。
如前所述:客户端不应该知道所请求服务的真正实现是什么。
编辑(回答编辑):
TypeScript编译器不会知道"在哪里选择这些类型Class / Interface,您必须在代码中使用tsconfig.json或引用(注释)让TypeScript了解定义此声明的位置。如果它是一种类型并不重要。
重要的是要理解当你导入(ES6样式)一个类并且从不真正使用它时(仅将它用作类型定义)它将被编译器删除,因为JavaScript中并不存在类型。 但,如果您使用它。例如:
var ui = new UiService(); // This will generate a javascript code
编译器不会删除import语句。
答案 1 :(得分:4)
...除非您有可以使用但具有共同基础的服务的不同实现。或者,当您想要在单元测试中模拟服务而不是直接使用它们时。
这正是原因所在。使用接口没有性能优势,因为接口不会出现在已编译的JavaScript中。
如果您愿意,可以使用服务类获取类型信息以及在角度Step by Step Guide中完成的操作 - 请参阅为数组创建类属性并注入组件。