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

Rob*_*ker 1 angularjs typescript

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

例:

class Dashboard {
    constructor(ui: IUiService){}
}
Run Code Online (Sandbox Code Playgroud)

VS

class Dashboard {
    constructor(ui: UiService){}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

gil*_*ran 5

这不是一个TypeScript问题,这是一个"什么是适合的接口"(简而言之)答案是:客户端不应该"知道"所请求服务的真正实现是什么.今天你的UiService足以满足你的需求,但有一天你可能会有另一个实现,甚至你想在你的测试中嘲笑它.

另一种情况是,UiService是由整个系统的ProUiService扩展的,你不得不遍布你的系统并改变注入的类型,而不是真正需要它.

如前所述:客户端不应该知道所请求服务的真正实现是什么.

编辑(回答编辑):

TypeScript编译器不会"知道"在哪里选择这些类型Class/Interface,您必须在代码中使用tsconfig.json或引用(注释)让TypeScript了解定义此声明的位置.如果它是一种类,则无关紧要.

重要的是要理解当你导入(ES6样式)一个类并且从不真正使用它时(仅将它用作类型定义)它将被编译器删除,因为JavaScript中并不存在类型. 但是,如果你使用它.例如:

var ui = new UiService(); // This will generate a javascript code
Run Code Online (Sandbox Code Playgroud)

编译器不会删除import语句.