如何使用Angular DI注入声明的命名空间?

时间:2018-05-18 04:27:46

标签: angular dependency-injection

我试图将npm url node_module注入Angular中的服务。

我知道我可以这样做:

import * as url from 'url';

可以在我的班级中使用它,如下所示:

url.format(); //using it

虽然我想注入它,因为我相信我应该尽快捕获错误,强制所有类在构造函数中使用它们的依赖项进行初始化。

我知道我可以使用带有接口的注入器令牌和useValue来注入简单的值。

interface MyInterface {
  property: string
}
const JS_PRETEND_TYPING = new InjectionToken<MyInterface>('small_desc');
const MY_VALUE = { a: 123 }

@NgModule({
  providers: [ { provide: JS_PRETEND_TYPING, useValue: MY_VALUE } ]
});

虽然网址包已将其输入声明为模块。

在网址包中:

declare module "url" {
    export interface UrlObject { 
    ...
}

所以我不能这样做因为我收到错误:

import * as url from 'url';


// ERROR: Cannot use namespace 'url' as a type. const
JS_PRETEND_TYPING_FOR_URL = new InjectionToken<url>('small_desc');

我如何注入&#39; url&#39; npm包进入我在Angular的服务?

import * as url from 'url';
class MyService {
   constructor(@Inject(JS_PRETEND_TYPING_FOR_URL) private url: url)
}

1 个答案:

答案 0 :(得分:1)

这是因为url不是类型。类具有与它们相关联的相同名称的类型,但变量,函数和名称空间不具有相同的名称。

应该是:

constructor(@Inject(JS_PRETEND_TYPING_FOR_URL) private url: typeof url)

使用DI进行库导入通常有点过分,除非知道它会以某种方式使它们受益(测试等)。在url的情况下,这没有意义。它可以通过监视其方法来测试。不太可能需要通过DI将其与其他东西交换。