Ich habe Beispielvorlagencode aus diesem Tutorial extrahiert und im Folgenden zwei Schritte ausgeführt, um loszulegen:
npm install // worked fine and created node_modules folder with all dependencies
npm start
// fehlgeschlagen mit unten Fehler-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
Ich sehe, dass in der subject.d.ts Erklärung des Aufzugs wie folgt ist -
lift<T, R>(operator: Operator<T, R>): Observable<T>;
Und in Observable.ts ist es wie folgt definiert:
lift<R>(operator: Operator<T, R>): Observable<R> {
Hinweis: - 1. Ich bin neu in Angular2 und versuche, Dinge in den Griff zu bekommen.
Der Fehler kann auf inkompatible Definitionen der Hebemethode zurückzuführen sein
Ich habe diesen Github-Thread durchgelesen
Wenn ich eine andere Version von rxjs installieren muss, erklären Sie bitte, wie Sie die richtigen rxjs deinstallieren und installieren.
Edit1: Ich antworte hier möglicherweise etwas spät, erhalte aber auch nach Verwendung von Typoskript 2.3.4 oder rxjs 6 alpha immer noch den gleichen Fehler . Unten ist meine 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"
}
}
quelle
Antworten:
Gemäß dieser müssen Sie Typoskript 2.3.4 aktualisieren oder rxjs 6 alpha
Gehen Sie in die Datei your package.json in Ihrem Projektupdate Typoskript oder in der rxjs-Version. Beispiel
machen
npm install
Update (29.06.2017): -
Gemäß den Kommentaren
"2.4.0"
funktioniert Typoskript .quelle
"typescript": "^2.3.4"
wird mit 2.4.1 übereinstimmen und 2.4 ist die Version, die das Problem mit RxJS aufdeckt."typescript": "2.3.0"
und"rxjs": "5.4.1"
arbeitete für michWie andere bereits betont haben, ist dieses Problem auf die in TypeScript 2.4 eingeführte strengere Typprüfung von Generika zurückzuführen. Dies stellte eine Inkonsistenz in einer RxJS-Typdefinition dar und wurde folglich in RxJS Version 5.4.2 behoben . Die ideale Lösung besteht also darin, einfach auf 5.4.2 zu aktualisieren.
Wenn Sie aus irgendeinem Grund kein Upgrade auf 5.4.2 durchführen können, sollten Sie stattdessen die Lösung von Alan Haddad verwenden, die Typdeklaration zu erweitern, um sie für Ihr eigenes Projekt zu beheben. Dh diesen Snippet zu deiner App hinzufügen:
Seine Lösung hinterlässt keine weiteren Nebenwirkungen und ist daher großartig. Alternativ haben vorgeschlagene Lösungen mehr Nebenwirkungen für Ihre Projekteinrichtung und sind daher weniger ideal:
--noStrictGenericChecks
. Dies macht es jedoch weniger streng für Ihre eigene App, was Sie tun können, führt jedoch möglicherweise inkonsistente Typdefinitionen ein, wie dies in dieser RxJS-Instanz der Fall war, was wiederum zu weiteren Fehlern in Ihrer App führen kann.quelle
Ein zugelassener Band-Aid-Ansatz besteht darin, Ihrer tsconfig.json-Datei Folgendes hinzuzufügen, bis die RxJS-Mitarbeiter entscheiden, was sie bei Verwendung von TypeScript 2.4.1 gegen den Fehler tun möchten:
quelle
skipLibCheck
. Wenn Sie das tun, sind Sie möglicherweise über andere Probleme hinweg. Eine bessere Lösung ist,noStrictGenericChecks
bis RxJS aktualisiert wird.Sie können das Problem vorübergehend mithilfe der Modulerweiterung umgehen
Der folgende Code hat das Problem für mich behoben. Sobald RxJS eine stabile Version hat, die dieses Problem nicht aufweist, sollte sie entfernt werden.
Während es vielleicht ironisch ist, dass RxJS selbst diese Technik so stark nutzt, um seine eigene Form zu beschreiben, ist sie tatsächlich allgemein auf eine Reihe von Problemen anwendbar.
Obwohl es sicherlich Grenzen und raue Kanten gibt, besteht ein Teil der Leistungsfähigkeit dieser Technik darin, dass wir sie verwenden können, um vorhandene Deklarationen zu verbessern und sie typsicherer zu machen, ohne die gesamte Datei zu verzweigen und zu pflegen.
quelle
"paths"
in verwenden,tsconfig.json
um explizit anzugeben, wo"rxjs"
und"rxjs/*"
für die Typüberprüfung aufgelöst werden soll. Das Vorhandensein mehrerer Versionen kann jedoch zu Laufzeitproblemen führen. Selbst wenn Sie keineinstanceof
anderen Tests verwenden, sind Ihre Deps möglicherweise weniger prinzipiell. Am besten öffnen Sie ein Problem mit videogular2 und schlagen vor, RxJS in eine Peer-Abhängigkeit zu ändern.in package.json
"rxjs": "^5.4.2",
und " typescript ": "^ 2.3.4", dann funktioniert npm install und ng .quelle
Nur ein bisschen Detail, um meine zwei Cent einzubringen.
Das Problem tritt auf, wenn wir Typescript auf die neueste Version aktualisieren , die inzwischen TypeScript 2.4.1 war ("wie wir die Upgrades lieben :) "], und wie von @ Jonnysai in seiner Antwort und dem dort bereitgestellten Link erwähnt eine ausführliche Diskussion über das Problem und seine Korrekturen.
Also, was war für mich war:
1. Ich musste Un installieren 2.4.1 Typoskript zuerst, indem Sie in der Systemsteuerung > Programme und Funktionen ...
2. Installieren, neu, Typoskript 2.4.0 , und vergewissern Sie sich , in
package.json
Datei haben Sie diese Konfiguration, wie hier in einem etwas kürzeren Detail erwähnt. Sie können herunterladen Typoskript 2.4.0 von hier , für Visual Studio 2015quelle
Sie können die vorübergehend verwenden
--noStrictGenericChecks
Flag , um dies in TypeScript 2.4 zu umgehen.Dies ist
--noStrictGenericChecks
in der Befehlszeile oder nur"noStrictGenericChecks": true
im"compilerOptions"
Feld intsconfig.json
.Beachten Sie, dass dies bei RxJS 6 korrigiert wird.
Siehe diese ähnliche Frage: Wie kann ich diesen Fehler in RxJS 5.x in TypeScript 2.4 umgehen?
quelle
Bitte ändern Sie die folgende
Subject.d.ts
Datei:zu:
Der Rückgabetyp sollte wahrscheinlich
Observable<R>
eher als seinObservable<T>
quelle
Behalten Sie die Option noStrictGeneric in der Datei tsconfig.config bei
quelle
Fügen Sie "noStrictGenericChecks": true in der Datei tsconfig.json unter dem Knoten "compilerOptions" hinzu , wie in der folgenden Abbildung gezeigt. Ich habe den gleichen Fehler festgestellt, nachdem dieser Fehler behoben wurde.
quelle
Ich habe das gleiche Problem gefunden und es gelöst, indem ich "rxjs": "5.4.1" , "typescript": "~ 2.4.0" verwendet und "noStrictGenericChecks": true in tsconfig.json hinzugefügt habe.
quelle
In RxJS 6 wird dies behoben, aber als vorübergehende Problemumgehung können Sie die
noStrictGenericChecks
Compileroption verwenden.In
tsconfig.json
, steckte es incompilerOptions
und setzen Sie ihn auf true.In der Kommandozeile ist es
--noStrictGenericChecks
.Warum es passiert:
TypeScript 2.4 hat eine Änderung der Strenge, und der Betreff hebt nicht zum richtigen Observable. Die Unterschrift hätte wirklich sein sollen
Dies wird in RxJS 6 behoben.
quelle
Gehen Sie zur Datei Package.json und ändern Sie die folgende Konfiguration
Es wird klappen
quelle
Die alleinige Verwendung hat jedoch nicht geholfen, wenn der folgende Ansatz verwendet wurde: Wie komme ich um diesen Fehler "Betreff erweitert Observable falsch" in TypeScript 2.4 und RxJs 5 herum?
löste die Probleme. Dort wird auch erwähnt, dass das Problem in RxJs 6 behoben wurde. Dies ist also eher eine vorübergehende Korrektur, die mir geholfen hat, dieses großartige Beispiel (das zuvor kompiliert wurde, aber den Fehler während der Ladezeit verursachte) erfolgreich auszuführen: Angular 4-Anwendungsentwicklung mit Bootstrap 4 und TypeScript
quelle
Neuinstallation von rxjs -> npm installiere rxjs @ 6 rxjs-compatible @ 6 --save
quelle
Jetzt brauchen wir das ionisch-native Modul nicht mehr - wir brauchen nur noch @ ionic-native / core. Lauf
Es wird Ihr Problem lösen ..
quelle
einfach hinzufügen
zu Ihrer tsconfig.json
quelle
danke der Antwort von zmag und Rahul Sharma, es funktioniert! @zmag @Rahul Sharma
Mein Problem ist wie folgt:
typings/globals/core-js/index.d.ts:3:14 - error TS2300: Duplicate identifier
Nehmen Sie Änderungen vor als.
Gehen Sie zur Datei Package.json und ändern Sie die folgende Konfiguration
quelle
Ja, das Problem war mit TypeScript 2.4.1. Ich habe dies gerade über die Systemsteuerung deinstalliert und es funktioniert für mich, da Visual Studio 2017 dies bereits hat.
quelle