我试图将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)
}
答案 0 :(得分:1)
这是因为url
不是类型。类具有与它们相关联的相同名称的类型,但变量,函数和名称空间不具有相同的名称。
应该是:
constructor(@Inject(JS_PRETEND_TYPING_FOR_URL) private url: typeof url)
使用DI进行库导入通常有点过分,除非知道它会以某种方式使它们受益(测试等)。在url
的情况下,这没有意义。它可以通过监视其方法来测试。不太可能需要通过DI将其与其他东西交换。