如何在 Typescript 类中创建 Angular 5 HttpClient 实例

Posted

技术标签:

【中文标题】如何在 Typescript 类中创建 Angular 5 HttpClient 实例【英文标题】:How to create Angular 5 HttpClient instance in Typescript class 【发布时间】:2018-03-15 22:17:33 【问题描述】:

我正在编写一个包含 httpClient 的基类。它用于进行 REST api 调用。如果在构造函数中定义了 httpClient 变量,但在私有变量中没有定义,则该变量设置正确。

这是我的示例代码:

@Injectable()
export class MyBaseClass implements 
  private httpClient = HttpClient

  constructor(
    private httpClient2: HttpClient
  ) 
    console.log("httpClient2", httpClient2)
    console.log("httpClient2.get", httpClient2.get)
  
  callApi() 
    console.log("httpClient", this.httpClient)
    console.log("httpClient.get", this.httpClient.get)
  

构造函数输出:

callApi 输出:

如您所见,这两个变量并不相同,并且 httpClient 的 get 属性未定义。

我会在整个类中使用构造函数中的变量,但我想要扩展这个类并且在构造函数中使用变量并不方便。

任何帮助/建议将不胜感激。

谢谢,

【问题讨论】:

您能否以派生类不需要特定构造函数的方式创建基类? 如果你的意思是子类,那么没有。我必须在构造函数子类中运行“super()”作为我的第一条语句。 派生类中绝对需要构造函数吗? 不错的主意,但我想我确实需要它们。 【参考方案1】:

如果您真的不想在基类的构造函数中注入服务,还有另一种选择。

1。 声明一个包含对注入器的引用的全局变量,并将其分配到您的模块中(或其他地方,在您的基类的构造函数被调用之前)

import Injector from '@angular/core';

export let InjectorInstance: Injector;

export class AppModule 

  constructor(private injector: Injector) 
  
    InjectorInstance = this.injector;
  

2 然后你可以在你的基类中像这样使用它

import InjectorInstance from '../app.module';

export class MyBaseClass  

    private httpClient : HttpClient:

    constructor()
    
        this.httpClient = InjectorInstance.get<HttpClient>(HttpClient);
    


【讨论】:

有趣的想法,我去看看。如果可行,我可能会将此作为我的答案...谢谢。【参考方案2】:

您的类上的属性httpClient 只是被设置为HttpClient 类构造函数。如果您需要该类的实例,则需要让 Angular 通过依赖注入将其提供给您,例如您的 httpClient2 属性(即作为构造函数的参数)。

请注意,将private 访问器添加到构造函数的参数是语法糖,它执行以下操作:

class MyBaseClass 
    private httpClient2: HttpClient;

    constructor(httpClient2: HttpClient) 
        this.httpClient2 = httpClient2;
    

【讨论】:

我真的很想避免在构造函数中注入它。 为什么?...这就是你在 Angular 中正确做事的方式 如果不使用依赖注入,你将很难正确测试,尤其是当你需要开始模拟网络调用之类的东西时 当我扩展 MyBaseClass 时,我希望在子类中能够调用 super()。有可能吗? 是的,你会这样做

以上是关于如何在 Typescript 类中创建 Angular 5 HttpClient 实例的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ngfor 指令不起作用,尽管我在 Typescript 类中创建了正确的对象

如何在 TypeScript 中创建循环引用类型?

如何在 TypeScript 中创建本地模块

如何在 JavaScript/TypeScript 中创建具有非唯一键的地图?

如何使用 bit 在 javascript 项目中创建 typescript 组件?

使用 RxJS 在 TypeScript 中创建 BaseObserver