title: RxJS combineLatest function can be imported from both rxjs and rxjs/operators, what is the difference between the two?
body: <p>The <em>combineLatest</em> function can be imported either from <em>rxjs</em> and from <em>rxjs/operators</em>.</p>
  
  <p>When I import it from <em>rxjs/operators</em> (just like I import <em>combineAll</em> I get the following error: </p>
  
  <pre><code>TS2339: Property 'subscribe' does not exist on type 'OperatorFunction&lt;{}, [{}, number, number, number]&gt;'
  </code></pre>
  
  <p>I used the following code snippet:</p>
  
  <pre><code>import { timer } from "rxjs";
  import { combineLatest } from "rxjs/operators";
  
  const timerOne = timer(1000, 2500);
  const timerTwo = timer(1500, 2500);
  const timerThree = timer(2000, 2500);
  
  //when one timer emits, emit the latest values from each timer as an array
  const combined$ = combineLatest(timerOne, timerTwo, timerThree);
  
  combined$.subscribe(
       ([timerValOne, timerValTwo, timerValThree]) =&gt; console.log(`Timer One Latest: ${timerValOne}, Two Latest: ${timerValTwo}, Three Latest: ${timerValThree}`)
  );
  </code></pre>
  
  <p>Therefore, I tried to import it from <em>rxjs</em> instead of <em>rxjs/operators</em> :</p>
  
  <pre><code>import { combineLatest } from "rxjs";
  </code></pre>
  
  <p>And suddenly it worked. Nice, but can anyone explain what the difference is between the two?</p>