Błąd rxjs / Subject.d.ts: Klasa „Subject <T>” niepoprawnie rozszerza klasę bazową „Observable <T>”


90

Wyodrębniłem przykładowy kod szablonu z tego samouczka i wykonałem poniżej dwa kroki, aby rozpocząć -

  1. npm install // worked fine and created node_modules folder with all dependencies
  2. npm start // nie powiodło się z poniższym błędem-

    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
    

Widzę że w temacie.d.ts deklaracja podniesienia jest jak poniżej -

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

A w Observable.ts jest zdefiniowane jak poniżej:

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

Uwaga: - 1. Jestem nowy w Angular2 i próbuję się opanować.

  1. Błąd może wynikać z niezgodnych definicji metody podnoszenia

  2. Przeczytałem ten wątek na githubie

  3. Jeśli muszę zainstalować inną wersję rxjs, powiedz, jak odinstalować i zainstalować poprawną wersję rxjs.

Edit1: Mogę trochę spóźnić się z odpowiedzią tutaj, ale nadal pojawia się ten sam błąd, nawet po użyciu maszynopisu 2.3.4 lub rxjs 6 alpha . Poniżej znajduje się mój plik 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"
  }
}



Wydaje się, że zostało to naprawione w rxjs@5.4.2 .

Odpowiedzi:


70

W związku z tym potrzebujesz zaktualizować maszynopis 2.3.4 lub rxjs 6 alpha

przejdź do pliku package.json w swoim skrypcie maszynowym lub wersji rxjs. Przykład

"typescript": "2.3.4"

zrobić npm install

aktualizacja (29.06.2017): -

Zgodnie z "2.4.0"działającym maszynopisem komentarzy .


6
"typescript": "^2.3.4"będzie pasować do 2.4.1 i 2.4 jest wersją, która ujawnia problem z RxJS.
Cartant

5
Zamieniona wersja maszynopisu na "2.4.0" zadziałała.
Ajhar Shaikh

1
Po drugie, musi to być dokładnie „2.3.4” - „^ 2.3.4” nie działało dla mnie.
maia

1
połączenie "typescript": "2.3.0"i "rxjs": "5.4.1"działało dla mnie
ericdemo07

@Jonnysai przepraszam, cofam to, co powiedziałem. Projekt został skompilowany, ale wystąpił błąd w czasie wykonywania i zostałem obniżony do wersji 2.3.4. Więcej tutaj: stackoverflow.com/a/44556137
Carcamano

25

Jak inni zauważyli, ten problem powstał w wyniku ściślejszego sprawdzania typów typów ogólnych wprowadzonych w TypeScript 2.4. To ujawniło niespójność w definicji typu RxJS i zostało w konsekwencji naprawione w RxJS w wersji 5.4.2 . Idealnym rozwiązaniem jest więc aktualizacja do wersji 5.4.2.

Jeśli z jakiegoś powodu nie możesz zaktualizować do wersji 5.4.2, powinieneś zamiast tego użyć rozwiązania Alana Haddada polegającego na rozszerzeniu deklaracji typu, aby naprawić to we własnym projekcie. To znaczy dodaj ten fragment do swojej aplikacji:

// 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>;
  }
}

Jego rozwiązanie nie pozostawi żadnych innych skutków ubocznych i dlatego jest świetne. Alternatywnie proponowane rozwiązania mają więcej skutków ubocznych dla konfiguracji projektu, a zatem są mniej idealne:

  • wyłącz bardziej rygorystyczne kontrole ogólne z flagą kompilatora --noStrictGenericChecks. To jednak sprawi, że będzie mniej restrykcyjny dla Twojej własnej aplikacji, co możesz zrobić, ale może wprowadzić niespójne definicje typów, tak jak to miało miejsce w tej instancji RxJS, co z kolei może wprowadzić więcej błędów w Twojej aplikacji.
  • Brak sprawdzania typów w bibliotekach z flagą --skipLibCheck ustawioną na true. To również nie jest idealne rozwiązanie, ponieważ niektóre błędy mogą nie zostać zgłoszone.
  • Aktualizacja do RxJS 6 Alpha - biorąc pod uwagę, że istnieją istotne zmiany, może to spowodować uszkodzenie aplikacji w źle udokumentowany sposób, ponieważ nadal jest w wersji alfa. Dodatkowo, jeśli masz inne zależności, takie jak Angular 2+, może to nie być obsługiwana opcja, co może zepsuć samą strukturę teraz lub w dół. Myślę, że jest to jeszcze trudniejsze zagadnienie do rozwiązania.

24

Przyznanym podejściem pomocniczym jest dodanie następujących elementów do pliku tsconfig.json, dopóki ludzie z RxJS nie zdecydują, co chcą zrobić z błędem podczas korzystania z TypeScript 2.4.1:

"compilerOptions": {

    "skipLibCheck": true,

 }

Dzięki za to, zadziałało. Próbowałem wielu innych rzeczy, ale myślę, że ten błąd jest związany z niewłaściwymi pakietami z niewłaściwą wersją, które nie obsługują się nawzajem ...
Salim

2
Myślę, że nie jest dobrym pomysłem wyłączanie lub blokowanie All LibCheck.
CharanRoot

Zasugerowałem to samo w kwestii github
Sean Newell

@Jonnysai, ponieważ nie jesteś właścicielem tego kodu, pominięcie sprawdzania bibliotek jest w porządku na krótką metę, ponieważ możesz zgłaszać problemy w bibliotekach, a następnie kontynuować własną pracę programistyczną. Możesz zgłosić swój własny problem i podać link do jego problemu, a gdy ich typy zostaną naprawione, możesz wyłączyć blokowanie.
Sean Newell

6
Prawdziwym rozwiązaniem nie powinno być skipLibCheck. Jeśli to robisz, potencjalnie zastanawiasz się nad innymi problemami. Lepszym rozwiązaniem jest noStrictGenericChecksdopóki RxJS nie zostanie zaktualizowany.
Daniel Rosenwasser

19

Możesz tymczasowo obejść ten problem, używając rozszerzenia modułu

Poniższy kod rozwiązał problem za mnie. Gdy RxJS ma stabilną wersję, która nie wykazuje tego problemu, należy ją usunąć.

// 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>;
  }
}

Chociaż być może ironią losu jest to, że sam RxJS tak intensywnie wykorzystuje tę technikę do opisania swojego własnego kształtu, w rzeczywistości ma ona ogólne zastosowanie do szeregu problemów.

Chociaż z pewnością istnieją ograniczenia i ostre krawędzie, częścią tego, co sprawia, że ​​ta technika jest potężna, jest to, że możemy jej użyć do ulepszenia istniejących deklaracji, dzięki czemu są bardziej bezpieczne bez rozwidlania i zachowują cały plik.


gdzie dodajesz lub importujesz ten plik?
Dave

1
dodaj go w dowolnym miejscu projektu, tak aby został pobrany przez kompilator. Jeśli używasz jawnych list plików, upewnij się, że są one uwzględnione. W przeciwnym razie powinien zostać odebrany automatycznie, o ile nie znajduje się powyżej pliku
tsconfig.json

2
Spróbowałem tego, ponieważ wydawało się to najmniej uciążliwą rzeczą. Działa dobrze.
Stephen Holt

1
Pomyślałem, jak dodać plik - "import 'rxjs / Subject';" (bez „od” lub nawiasów klamrowych) w app.component.ts.
John Pankowicz

1
@JaredWhipple To poważny problem, który ma konsekwencje nie tylko do sprawdzania typów. Możesz użyć "paths"in, tsconfig.jsonaby wyraźnie określić, gdzie "rxjs"i "rxjs/*"powinien być rozpoznawany sprawdzanie typów. Jednak posiadanie wielu wersji może powodować problemy w czasie wykonywania. Nawet jeśli nie używasz instanceofi innych takich testów, twoje deps mogą być mniej pryncypialne. Najlepiej jest otworzyć problem z videogular2 sugerujący zmianę RxJS na zależność równorzędną.
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"
}

w package.json "rxjs": "^5.4.2", i "typescript": "^ 2.3.4", a następnie npm install i ng działają.


8

Tylko trochę szczegółów, próbując włożyć moje dwa centy.

Problem pojawia się, gdy uaktualnimy Typescript do najnowszej wersji, która była teraz TypeScript 2.4.1 , ["ponieważ uwielbiamy uaktualnienia :) "] i jak wspomniał @ Jonnysai w swojej odpowiedzi i podanym tam linku, jest szczegółowe omówienie problemu i jego poprawek.

Więc, co pracował dla mnie:
1. Musiałem Un zainstalować maszynopis 2.4.1 pierwsze, przechodząc do Panelu sterowania > Programy i funkcje ...
2. Zainstaluj, nowo, maszynopis 2.4.0 , a następnie upewnij się, w package.jsonplik, masz taką konfigurację, jak wspomniano tutaj w raczej krótszym szczególe. Można pobrać maszynopis 2.4.0 od tutaj , na Visual Studio 2015

wprowadź opis obrazu tutaj



To działało bardzo prosto, bez „obejść”. Nie jestem pewien, czy to ma znaczenie, ale mój rxjs to „5.0.1” i nie zmieniłem tego, ale wszystko wydaje się w porządku. Dzięki za dwa centy - pomogło mi!
Tom A,

Ja też mam ten problem używając Typescript 2.3.4. Nie wydaje się więc prawidłowe, że problem pojawia się z powodu aktualizacji do wersji 2.4.1. Obecne angular-cli instaluje 2.3.4, ponieważ mówi, że wymaga <2.4.0.
John Pankowicz


3

Zmień następujący wiersz Subject.d.tspliku:

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

do:

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

Typ zwracany powinien Observable<R>raczej być niżObservable<T>


3

Pozostaw opcję noStrictGeneric true w pliku tsconfig.config

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

3

Dodaj „noStrictGenericChecks”: true w pliku tsconfig.json w węźle „compilerOptions”, jak pokazano na poniższym obrazku i zbuduj aplikację. Po dodaniu napotkałem ten sam błąd, rozwiązany. wprowadź opis obrazu tutaj


2

Znalazłem ten sam problem i rozwiązałem go, używając "rxjs": "5.4.1" , "Typscript": "~ 2.4.0" i dodając "noStrictGenericChecks": true do tsconfig.json.


1

RxJS 6 będzie mieć to naprawione, ale jako tymczasowe obejście można użyć noStrictGenericChecksopcji kompilatora.

W tsconfig.json, włóż go compilerOptionsi ustaw na true.

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

W linii poleceń to --noStrictGenericChecks.

Dlaczego tak się dzieje:

TypeScript 2.4 ma zmianę ścisłości, a Subject nie jest podnoszony do prawidłowego Observable. Podpis naprawdę powinien

(operator: Operator) => Obserwowalne

Zostanie to naprawione w RxJS 6.


1

Przejdź do pliku Package.json i zmodyfikuj poniższą konfigurację

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

To będzie działać


0

Samo użycie powyższego nie pomogło jednak, stosując następujące podejście: Jak obejść ten błąd „Temat nieprawidłowo rozszerza Observable” w TypeScript 2.4 i RxJs 5

rozwiązał problemy. Wspomniano tam również, że problem został rozwiązany w RxJs 6, więc jest to raczej tymczasowa poprawka, która pomogła mi w pomyślnym uruchomieniu tego świetnego przykładu (który został skompilowany wcześniej, ale dał błąd podczas ładowania): Tworzenie aplikacji Angular 4 z Bootstrap 4 i TypeScript


0

ponowna instalacja rxjs -> npm install rxjs @ 6 rxjs -atible @ 6 --zapisz


0

Teraz nie potrzebujemy modułu ionic-native - potrzebujemy tylko @ ionic-native / core. Biegać

npm uninstall ionic-native --save

To rozwiąże Twój problem.



0

dzięki odpowiedzi zmag i Rahul Sharma, działa! @zmag @Rahul Sharma

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

mój problem jest następujący:

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

Wprowadź zmiany jako.

Przejdź do pliku Package.json i zmodyfikuj poniższą konfigurację

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

-3

tak, problem był z TypeScript 2.4.1 Właśnie odinstalowałem to z Panelu sterowania i działa dla mnie, ponieważ Visual Studio 2017 już to ma.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.