title: RxJS6: Why observable Pipe operator only receives OperatorFunction and not MonoTypeOperatorFunction
body: <p>I'm trying to understand the <code>pipe</code> operator of observable API:</p>
  
  <pre><code> export declare class Observable&lt;T&gt; implements Subscribable&lt;T&gt; {
  .......
      pipe&lt;A&gt;(op1: OperatorFunction&lt;T, A&gt;): Observable&lt;A&gt;;
      pipe&lt;A, B&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;): Observable&lt;B&gt;;
      pipe&lt;A, B, C&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;): Observable&lt;C&gt;;
      pipe&lt;A, B, C, D&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;): Observable&lt;D&gt;;
      pipe&lt;A, B, C, D, E&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;, op5: OperatorFunction&lt;D, E&gt;): Observable&lt;E&gt;;
      pipe&lt;A, B, C, D, E, F&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;, op5: OperatorFunction&lt;D, E&gt;, op6: OperatorFunction&lt;E, F&gt;): Observable&lt;F&gt;;
      pipe&lt;A, B, C, D, E, F, G&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;, op5: OperatorFunction&lt;D, E&gt;, op6: OperatorFunction&lt;E, F&gt;, op7: OperatorFunction&lt;F, G&gt;): Observable&lt;G&gt;;
      pipe&lt;A, B, C, D, E, F, G, H&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;, op5: OperatorFunction&lt;D, E&gt;, op6: OperatorFunction&lt;E, F&gt;, op7: OperatorFunction&lt;F, G&gt;, op8: OperatorFunction&lt;G, H&gt;): Observable&lt;H&gt;;
      pipe&lt;A, B, C, D, E, F, G, H, I&gt;(op1: OperatorFunction&lt;T, A&gt;, op2: OperatorFunction&lt;A, B&gt;, op3: OperatorFunction&lt;B, C&gt;, op4: OperatorFunction&lt;C, D&gt;, op5: OperatorFunction&lt;D, E&gt;, op6: OperatorFunction&lt;E, F&gt;, op7: OperatorFunction&lt;F, G&gt;, op8: OperatorFunction&lt;G, H&gt;, op9: OperatorFunction&lt;H, I&gt;): Observable&lt;I&gt;;
  .......
  }
  </code></pre>
  
  <p>As you could see, all of pipe overload methods receive and <code>OperationFunction</code> type.</p>
  
  <p>Lets check the filter operator API:</p>
  
  <pre><code>export declare function filter&lt;T, S extends T&gt;(predicate: (value: T, index: number) =&gt; value is S, thisArg?: any): OperatorFunction&lt;T, S&gt;;
  export declare function filter&lt;T&gt;(predicate: (value: T, index: number) =&gt; boolean, thisArg?: any): MonoTypeOperatorFunction&lt;T&gt;;
  </code></pre>
  
  <p>As you can see, you have an overload method that returns an <code>OperationFunction</code> and another that returns <code>MonoTypeOperatorFunction</code>.</p>
  
  <p>I have the following questions:</p>
  
  <ul>
  <li>RxJS6 operators like <code>filter</code>, could only be used on <code>pipe</code> method?</li>
  <li>Why in filter we have a overload method that return different types but the <code>pipe</code> only receives one?</li>
  </ul>