【问题标题】:What is the purpose of using TypeScript interfaces for angular services for type information将 TypeScript 接口用于类型信息的角度服务的目的是什么
【发布时间】:2015-08-25 02:54:16
【问题描述】:

为 Angular 服务创建接口与导出服务类并将其用于类型信息的优势是什么?

例子:

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

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

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

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

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

【问题讨论】:

    标签: angularjs typescript


    【解决方案1】:

    这不是 TypeScript 问题,而是“接口有什么用” (简而言之)答案是:客户端不应该“知道”所请求服务的真正实现是什么。 您今天的 UiService 足以满足您的需求,但有一天您可能会有另一种实现,甚至您想在测试中模拟它。

    另一种情况是,UiService 由 ProUiService 在您的整个系统中扩展,您将不得不在您的系统中检查并更改注入的类型,而实际上并不需要它。

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

    编辑(回答编辑):

    TypeScript 编译器不会“知道”在哪里选择这些类型类/接口,您必须在代码中使用 tsconfig.json 或引用(注释)来让 TypeScript 了解此声明的定义位置。是否是类的类型无关紧要。

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

    var ui = new UiService(); // This will generate a javascript code
    

    编译器不会删除 import 语句。

    【讨论】:

    • 我认为这是正确的!
    • 这是一个打字稿问题,因为我想知道 ts 编译器在这两种情况下会做什么。尤其是当涉及到 ES6 导入一个仅用于类型信息的类时。
    【解决方案2】:

    ...除非您有可以使用但具有共同基础的服务的不同实现。或者当您想在单元测试中模拟服务而不是直接使用它们时。

    这正是原因。使用接口没有性能优势,因为接口不会出现在转译的 JavaScript 中。

    如果您愿意,您可以使用服务类来获取类型信息,这就是在 angular Step by Step Guide 中所做的——请参阅为数组属性创建一个类并注入到组件中。 p>

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 2020-01-02
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多