Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get around this "Subject incorrectly extends Observable" error in TypeScript 2.4 and RxJS 5.x?

When I compile, I get the following compiler error in the RxJS declaration files:

node_modules/rxjs/Subject.d.ts(16,22): error TS2415: Class 'Subject<T>' incorrectly extends base class 'Observable<T>'.   Types of property 'lift' are incompatible.     Type '<R>(operator: Operator<T, R>) => Observable<T>' is not assignable to type '<R>(operator: Operator<T, R>) => Observable<R>'.       Type 'Observable<T>' is not assignable to type 'Observable<R>'.          Type 'T' is not assignable to type 'R'. 

What's going on here, and how do I get around this without downgrading to TypeScript 2.3 or earlier?

like image 828
Daniel Rosenwasser Avatar asked Jun 28 '17 18:06

Daniel Rosenwasser


1 Answers

Solution

RxJS 5.4.2 should now work perfectly with TypeScript 2.4.1. Simply upgrade to 5.4.2+ if possible.

npm install --save rxjs@^5.4.2 

Then try restarting your editor and/or recompile if you don't see an immediate change.

If not, the below solution should work.

Why it's happening

TypeScript 2.4 has a strictness change, and Subject<T> isn't lifting to the correct Observable. The signature really should have been

<R>(operator: Operator<T, R>) => Observable<R> 

This will be fixed in RxJS 6.

Alternative Solution

Newer versions of RxJS will have this fixed, but as a temporary workaround, you can use the noStrictGenericChecks compiler option.

In tsconfig.json, put it in "compilerOptions" and set it to true.

{     "compilerOptions": {         "noStrictGenericChecks": true     } } 

On the command line it's --noStrictGenericChecks.

like image 55
Daniel Rosenwasser Avatar answered Sep 21 '22 06:09

Daniel Rosenwasser