Как я могу ввести заявленное пространство имен с Angular DI? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь вставить npm url node_module в мой сервис на Angular.

Я знаю, что могу просто сделать:

import * as url from 'url';

и может использовать его в моем классе следующим образом:

url.format(); //using it

Хотя я хочу внедрить его, так как считаю, что должен быстрее отлавливать ошибки, заставляя все мои классы инициализироваться с их зависимостями в конструкторе.

Я знаю, что могу использовать жетоны инжектора с интерфейсом и использовать Value для ввода простых значений.

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 } ]
});

Несмотря на то, что пакет url имеет типизацию, объявленную как модуль.

В пакете URL:

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');

Как я могу внедрить пакет 'url' npm в мой сервис на Angular?

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

1 Ответ

0 голосов
/ 18 мая 2018

Это происходит потому, что url не тип.Классы имеют типы с одинаковыми именами, связанные с ними, но переменные, функции и пространства имен этого не делают.

Это должно быть:

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

Обычно использование DI для импорта библиотек излишне,если не известно, что это принесет им какую-то пользу (тестирование и т. д.).В случае url это не имеет смысла.Это можно проверить, следя за его методами.Маловероятно, что возникнет необходимость поменять его на что-то другое с помощью DI.

...