Errore rxjs / Subject.d.ts: la classe "Subject <T>" estende in modo errato la classe base "Observable <T>"


89

Ho estratto il codice del modello di esempio da questo tutorial e ho seguito due passaggi per iniziare:

  1. npm install // worked fine and created node_modules folder with all dependencies
  2. npm start // fallito con il seguente errore-

    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 '<T, 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'.
      npm ERR! code ELIFECYCLE
      npm ERR! errno 2

Vedo che nell'oggetto.d. la sua dichiarazione di ascensore è la seguente:

 lift<T, R>(operator: Operator<T, R>): Observable<T>;

E in Observable.ts è definito come di seguito-

 lift<R>(operator: Operator<T, R>): Observable<R> {

Nota: - 1. Sono nuovo in Angular2 e sto cercando di ottenere informazioni.

  1. L'errore potrebbe essere dovuto a definizioni incompatibili del metodo lift

  2. Ho letto questo thread di GitHub

  3. Se ho bisogno di installare una versione diversa di rxjs, ti preghiamo di indicare come disinstallare e installare rxjs corretto.

Edit1: potrei essere un po 'in ritardo nel rispondere qui, ma ricevo ancora lo stesso errore anche dopo aver usato il dattiloscritto 2.3.4 o rxjs 6 alpha . Di seguito è riportato il mio package.json,

{
  "name": "angular-quickstart",
  "version": "1.0.0",
  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },
  "license": "ISC",
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.3",
    "rxjs": "6.0.0-alpha.0",
    "systemjs": "0.19.27",
    "zone.js": "^0.6.23",
    "angular2-in-memory-web-api": "0.0.20",
    "bootstrap": "^3.3.6"
  },
  "devDependencies": {
    "concurrently": "^2.2.0",
    "lite-server": "^2.2.2",
    "typescript": "2.3.4",
    "typings": "^1.3.2"
  }
}



Questo sembra essere stato risolto in rxjs@5.4.2 .

Risposte:


70

Per questo motivo è necessario aggiornare il dattiloscritto 2.3.4 o rxjs 6 alpha

vai al tuo file package.json nel tuo dattiloscritto di aggiornamento del progetto o nella versione rxjs. Esempio

"typescript": "2.3.4"

fare npm install

aggiornamento (29/06/2017): -

Come per i commenti dattiloscritto "2.4.0"funzionanti.


6
"typescript": "^2.3.4"corrisponderà a 2.4.1 e 2.4 è la versione che espone il problema con RxJS.
cartant

5
La versione dattiloscritta sostituita a "2.4.0" ha funzionato per me.
Ajax

1
Secondo che deve essere esattamente "2.3.4" - "^ 2.3.4" non ha funzionato per me.
maia

1
combinazione di "typescript": "2.3.0"e ha "rxjs": "5.4.1"funzionato per me
ericdemo07

@Jonnysai scusa, riprendo quello che ho detto. Progetto compilato, ma ho ricevuto un errore di runtime e ho eseguito il downgrade a 2.3.4. Maggiori informazioni qui: stackoverflow.com/a/44556137
Carcamano

25

Come altri hanno sottolineato, questo problema è nato come conseguenza del controllo del tipo più rigoroso dei generici introdotto in TypeScript 2.4. Ciò ha rivelato un'incongruenza nella definizione del tipo RxJS ed è stato di conseguenza risolto nella versione 5.4.2 di RxJS . Quindi la soluzione ideale è semplicemente aggiornare alla 5.4.2.

Se per qualche motivo non puoi eseguire l'aggiornamento a 5.4.2 dovresti invece utilizzare la soluzione di Alan Haddad di aumentare la dichiarazione del tipo per risolverlo per il tuo progetto. Ad esempio, aggiungi questo snippet alla tua app:

// TODO: Remove this when RxJS releases a stable version with a correct declaration of `Subject`.
import { Operator } from 'rxjs/Operator';
import { Observable } from 'rxjs/Observable';

declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

La sua soluzione non lascerà altri effetti collaterali ed è quindi eccezionale. Le soluzioni proposte in alternativa hanno più effetti collaterali per la configurazione del progetto e quindi sono meno ideali:

  • disattivare i controlli generici più severi con il flag del compilatore --noStrictGenericChecks. Ciò tuttavia lo renderà meno rigoroso per la tua app, cosa che puoi fare, ma potrebbe introdurre definizioni di tipo incoerenti come ha fatto in questa istanza RxJS che a sua volta potrebbe introdurre più bug nella tua app.
  • Non controllare i tipi nelle librerie con flag --skipLibCheck impostato su true. Anche questo non è l'ideale in quanto potresti non ricevere alcuni errori di tipo segnalati.
  • Aggiornamento a RxJS 6 Alpha: dato che ci sono modifiche di rottura, ciò potrebbe danneggiare la tua app in modi mal documentati, visto che è ancora in alpha. Inoltre, se hai altre dipendenze come Angular 2+, questa potrebbe non essere un'opzione supportata, interrompendo il framework stesso ora o su tutta la linea. Che penso sia un problema ancora più difficile da risolvere.

24

Un approccio ammesso di cerotto consiste nell'aggiungere quanto segue al file tsconfig.json fino a quando le persone RxJS non decidono cosa vogliono fare riguardo all'errore quando usano TypeScript 2.4.1:

"compilerOptions": {

    "skipLibCheck": true,

 }

Grazie per questo, ha funzionato. Ho provato molte altre cose ma immagino che questo errore sia correlato a pacchetti sbagliati con una versione sbagliata che non si supportano a vicenda ...
Salim

2
Penso che non sia una buona idea disabilitare o sopprimere All LibCheck.
CharanRoot

Ho suggerito la stessa cosa sulla questione di GitHub
Sean Newell,

@Jonnysai dato che non possiedi quel codice, sopprimere il controllo della lib va ​​bene a breve termine poiché puoi archiviare problemi con le librerie e quindi continuare il tuo lavoro di sviluppo. Puoi archiviare il tuo problema e collegarlo al problema, e quando i loro tipi vengono risolti puoi rimuovere la soppressione.
Sean Newell,

6
La vera soluzione non dovrebbe essere quella skipLibCheck. Se lo fai, stai potenzialmente superando altri problemi. Una soluzione migliore è noStrictGenericChecksfinché RxJS non viene aggiornato.
Daniel Rosenwasser

19

È possibile aggirare temporaneamente il problema utilizzando Module Augmentation

Il codice seguente ha risolto il problema per me. Una volta che RxJS ha una versione stabile che non presenta questo problema, dovrebbe essere rimosso.

// augmentations.ts
import {Operator} from 'rxjs/Operator';
import {Observable} from 'rxjs/Observable';

// TODO: Remove this when a stable release of RxJS without the bug is available.
declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

Sebbene sia forse ironico che RxJS stesso faccia un uso così intenso di questa tecnica per descrivere la propria forma, in realtà è generalmente applicabile a una serie di problemi.

Sebbene ci siano certamente limiti e spigoli, parte di ciò che rende potente questa tecnica è che possiamo usarla per migliorare le dichiarazioni esistenti rendendole più sicure senza biforcazione e mantenendo l'intero file.


dove aggiungi o importi questo file?
Dave

1
aggiungilo ovunque nel tuo progetto in modo che venga rilevato dal compilatore. Se stai usando elenchi di file espliciti, assicurati che sia incluso. Altrimenti dovrebbe essere prelevato automaticamente fintanto che non si trova sopra il file
tsconfig.json

2
Ho provato questo, poiché sembrava la cosa meno dirompente da fare. Ha funzionato bene.
Stephen Holt

1
Ho capito come aggiungere il file - "import 'rxjs / Subject';" (senza "da" o parentesi graffe) in app.component.ts.
John Pankowicz

1
@JaredWhipple Questo è un problema serio e ha implicazioni per molto di più del controllo dei tipi. È possibile utilizzare "paths"in tsconfig.jsonper specificare esplicitamente dove"rxjs" e "rxjs/*"dovrebbe risolversi per il controllo del tipo. Tuttavia, è probabile che avere più versioni causi problemi di runtime. Anche se non usi instanceofe altri test simili, i tuoi deps potrebbero essere meno basati sui principi. La cosa migliore da fare è aprire un problema con videogular2 suggerendo di cambiare RxJS in una dipendenza peer.
Aluan Haddad

9
"dependencies": {
"@angular/animations": "^4.3.1",
"@angular/common": "^4.3.1",
"@angular/compiler": "^4.3.1",
"@angular/compiler-cli": "^4.3.1",
"@angular/core": "^4.3.1",
"@angular/forms": "^4.3.1",
"@angular/http": "^4.3.1",
"@angular/platform-browser": "^4.3.1",
"@angular/platform-browser-dynamic": "^4.3.1",
"@angular/platform-server": "^4.3.1",
"@angular/router": "^4.3.1",
"core-js": "^2.4.1",
"rxjs": "^5.4.2",
"ts-helpers": "^1.1.1",
"zone.js": "^0.7.2"
},
"devDependencies": {
"@angular/compiler-cli": "^2.3.1",
"@types/jasmine": "2.5.38",
"@types/node": "^6.0.42",
"angular-cli": "1.0.0-beta.28.3",
"codelyzer": "~2.0.0-beta.1",
"jasmine-core": "2.5.2",
"jasmine-spec-reporter": "2.5.0",
"karma": "1.2.0",
"karma-chrome-launcher": "^2.0.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.0.2",
"karma-remap-istanbul": "^0.2.1",
"protractor": "~4.0.13",
"ts-node": "1.2.1",
"tslint": "^4.3.0",
"typescript": "^2.3.4",
"typings": "^1.3.2"
}

in package.json "rxjs": "^5.4.2", e "typescript": "^ 2.3.4", quindi npm install e ng serve il suo funzionamento.


8

Solo un po 'di dettagli, nel tentativo di mettere i miei due centesimi.

Il problema sorge quando aggiorniamo Typescript all'ultima versione, che ormai era TypeScript 2.4.1 , ["come amiamo gli aggiornamenti :) "], e come menzionato da @ Jonnysai nella sua risposta e nel link fornito lì, c'è una discussione dettagliata riguardante il problema e le sue soluzioni.

Allora, che cosa ha lavorato per me era:
1. Ho dovuto Un installare dattiloscritto 2.4.1 prima, andando su Pannello di controllo > Programmi e funzionalità ...
2. Installare, di nuovo, dattiloscritto 2.4.0 , e quindi assicurarsi, in package.jsonfile, hai questa configurazione, come menzionato qui in un dettaglio piuttosto breve. Puoi scaricare TypeScript 2.4.0 da qui , per Visual Studio 2015

inserisci qui la descrizione dell'immagine



Questo ha funzionato molto semplicemente senza "soluzioni alternative". Non sono sicuro che questo importi, ma il mio rxjs era "5.0.1" e non l'ho cambiato, sembra tutto a posto. Grazie per i tuoi due centesimi - mi ha aiutato!
Tom A

Ho anche questo problema usando Typescript 2.3.4. Quindi non sembra corretto che il problema sorga a causa dell'aggiornamento alla 2.4.1. L'attuale angular-cli installa 2.3.4 perché dice che richiede <2.4.0.
John Pankowicz


3

Modificare la seguente riga di Subject.d.tsfile:

lift<R>(operator: Operator<T, R>): Observable<T>;

per:

lift<R>(operator: Operator<T, R>): Observable<R>;

Il tipo restituito dovrebbe probabilmente essere Observable<R>piuttosto cheObservable<T>


3

Mantieni l'opzione noStrictGeneric true nel file tsconfig.config

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

3

Aggiungi "noStrictGenericChecks": true nel file tsconfig.json sotto il nodo "compilerOptions" come mostrato nell'immagine sottostante e nell'applicazione di compilazione. Ho riscontrato lo stesso errore dopo aver aggiunto questo errore risolto. inserisci qui la descrizione dell'immagine


2

Ho trovato lo stesso problema e l'ho risolto utilizzando "rxjs": "5.4.1" , "typescript": "~ 2.4.0" e aggiungendo "noStrictGenericChecks": true in tsconfig.json.


1

RxJS 6 risolverà questo problema, ma come soluzione temporanea, puoi utilizzare l' noStrictGenericChecksopzione del compilatore.

In tsconfig.json, metterlo in compilerOptionse impostarlo su true.

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

Sulla riga di comando è --noStrictGenericChecks.

Perché sta succedendo:

TypeScript 2.4 ha una modifica di rigore e Subject non viene elevato all'osservabile corretto. La firma avrebbe dovuto davvero essere

(operator: Operator) => Observable

Questo verrà risolto in RxJS 6.


1

Vai al file Package.json e modifica la configurazione seguente

...
  "rxjs": "5.4.1",
  "typescript": "~2.4.0"
...

Funzionerà


0

L'utilizzo di quanto sopra da solo non ha aiutato, tuttavia, utilizzando il seguente approccio: Come posso aggirare questo errore "Il soggetto estende in modo errato Observable" in TypeScript 2.4 e RxJs 5

risolto i problemi. Viene anche menzionato che il problema è stato risolto in RxJs 6, quindi questa è più una soluzione temporanea, che mi ha aiutato a eseguire con successo questo ottimo esempio (che è stato compilato prima ma ha fornito l'errore durante il tempo di caricamento): Sviluppo dell'applicazione Angular 4 con Bootstrap 4 e TypeScript


0

reinstallare rxjs -> npm install rxjs @ 6 rxjs-compat @ 6 --salva


0

Ora non abbiamo bisogno del modulo ionic-native - abbiamo solo bisogno di @ ionic-native / core. Correre

npm uninstall ionic-native --save

Risolverà il tuo problema ..



0

grazie la risposta di zmag e Rahul Sharma, funziona! @zmag @Rahul Sharma

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"

il mio problema è il seguente:

typings/globals/core-js/index.d.ts:3:14 - error TS2300: Duplicate identifier

Apporta modifiche come.

Vai al file Package.json e modifica la configurazione seguente

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"

-3

sì, il problema era con TypeScript 2.4.1 L'ho appena disinstallato dal pannello di controllo e funziona per me poiché Visual Studio 2017 ha già questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.