将TypeScript接口用于角度服务以获取类型信息的目的是什么

时间:2015-08-20 17:59:28

标签: angularjs typescript

为角度服务创建接口与导出服务类并将其用于类型信息有什么好处?

示例:

class Dashboard {
    constructor(ui: IUiService){}
}

VS

class Dashboard {
    constructor(ui: UiService){}
}

是否有性能优势?如果我只使用服务类来获取类型信息会发生什么?

除非您拥有可以使用但具有共同基础的服务的不同实现,否则它似乎是没有任何好处的额外工作。或者,当您想要在单元测试中模拟服务而不是直接使用它们时。

编辑:我很想知道打字稿编译器将对仅用于类型信息的导入做什么。它会调用构造函数还是添加到require语句(ES6)?它会新建一个类的实例吗?

2 个答案:

答案 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中完成的操作 - 请参阅为数组创建类属性并注入组件