Angular распознает импорт из корня?

У меня есть простой сервис, который использует Inject/Injectable :

import {Inject, Injectable} from '@angular/core';
import {APP_CONFIG} from '../../config/app-config.module';
import {AppConfig} from '../models/core/app-config.model';

@Injectable()
export class AuthService {
    constructor(@Inject(APP_CONFIG) private config:AppConfig) {
    }
}

Здесь нет ничего нового, однако, как мы знаем, я должен импортировать Inject, Injectable.

Даже если бы я импортировал Inject, Injectable в корневой модуль, мне все равно пришлось бы импортировать их в файл.

OK.

Но теперь я столкнулся с ситуацией (код не мой), когда разработчик импортировал некоторые операторы RXJS в корневую папку:

rxjs-imports.ts

import 'rxjs/add/operator/filter'
import 'rxjs/add/operator/do'
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/catch'
import 'rxjs/add/operator/shareReplay'
import 'rxjs/add/operator/distinctUntilChanged'
import 'rxjs/add/operator/pluck'

введите здесь описание изображения

Затем он импортировал файл в app.module.ts :

import './rxjs-imports';

И теперь он может использовать эти операторы без их импорта(!) в другом компоненте/сервисе:

 import {Observable} from 'rxjs/Observable';
//no imports for operators
  public get<T>(name: string) :Observable<T>{
        return this.subj.pluck( "d");     <---- how does it knows pluck ?
    }

Вопрос:

Я не понимаю - как это работает? Я ожидал, что компилятор будет кричать, чтобы добавить оператор pluck


person Royi Namir    schedule 30.12.2017    source источник


Ответы (1)


import 'rxjs/add/operator/xxx' фактически исправляет прототип Observable и расширяет его указанными операторами, таким образом, импорт файлов позволяет использовать эти операторы с каждым Observable в вашем коде с этого момента.

Вы можете увидеть, как это делается в исходном коде RxJS, например, в catch.

person Tsvetan Ganev    schedule 30.12.2017