Website-Suche

javascript - Typescript Modul löst 'rxjs' im selben Datei unterschiedlich auf


Ich habe Stunden damit verbracht, im Kreis zu gehen, also ist es Zeit für eine weitere obskure Frage.

Ich befinde mich in einem lerna Mono-Repository, mit zwei Unterprojekten, ProjectA und ProjectB.

ProjectA hat eine Abhängigkeit von rxjs, ebenso wie ProjectB.

ProjectB hat eine Abhängigkeit von ProjectA, die lerna durch die Verwendung von Symlinks verwaltet.

Das Problem ist, dass ich in ProjectB eine Datei habe, die folgende Importe durchführt:

import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";

In dieser Datei gibt es eine Klasse, die eine private Variable hat, die ein Subject ist, und sie als Observable bereitstellt. Allerdings meldet tsc den folgenden Fehler:

Typ 'Subject<ActionRequestResult<any>>' ist nicht zuweisbar zum Typ 'Observable<ActionRequestResult<any>>'. Die Eigenschaft 'source' ist geschützt, aber der Typ 'Observable<T>' ist keine von 'Observable<T>' abgeleitete Klasse.

Nach der Untersuchung stellt sich heraus, dass die beiden rxjs-Imports am Anfang der Datei tatsächlich aus zwei verschiedenen Orten importiert werden. Auch wenn Subject Observable erweitert, handelt es sich nicht um dasselbe Observable, das in meiner Datei importiert und referenziert wird.

Ich habe versucht, rxjs auf Projektebene zu installieren, wo sich die lerna.json-Datei befindet. Aber ProjectB hat eine Abhängigkeit von webpack-cli, die wiederum eine transitive Abhängigkeit von rxjs hat, sodass es trotzdem in ProjectB installiert wird.

Also bin ich mir nicht genau sicher, wohin ich gehen soll, oder ob das ein Fehler ist oder nicht?

ProjectA verwendet intern Subject, daher vermute ich, dass Typescript den Projektbaum durchläuft und zwischenspeichert, wo sich jeder Bestandteil befindet, und dies in der Situation, in der ich mich befinde, fehlschlägt.

Irgendwelche Gedanken oder Ratschläge?

Antwort #1

Es ist mir gelungen, das Problem zu beheben, indem ich die Reihenfolge meiner Importanweisungen geändert habe. Ich glaube, dies ist ein Fehler im Zusammenhang mit dem Typescript-Sprachdienst und der Art und Weise, wie er Dinge zwischenspeichert. Ich werde bald ein Problem melden.

Im Grunde hatte ich das hier:

import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";

Weil ProjectA Subject referenziert hat, speichert der Sprachdienst das offenbar im Cache, sodass er beim eigenen Import die Referenz verwendet, die er bereits hat.

Das Verschieben des Imports von ProjectA ans Ende löste das Problem:

import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';