javascript - Typescript modul řeší 'rxjs' odlišně ve stejném souboru
Strávil jsem hodiny tím, že jsem chodil dokola, takže je čas na další tajemnou otázku.
Jsem uvnitř monorepa lerna, se dvěma podsložkami, ProjectA a ProjectB.
ProjectA má závislost na rxjs, stejně jako ProjectB.
ProjectB má závislost na ProjectA, kterou lerna spravuje pomocí symlinků.
Problém je, že v ProjectB mám soubor, který provádí následující importy:
import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";
V tomto souboru je třída, která má soukromou proměnnou, která je Subject, a zpřístupňuje ji jako Observable. Nicméně tsc hlásí následující chybu:
Typ '
Subject<ActionRequestResult<any>>' nelze přiřadit k typu 'Observable<ActionRequestResult<any>>'. Vlastnost 'source' je chráněná, ale typ 'Observable<T>' není třídou odvozenou od 'Observable<T>'.
Po prozkoumání se ukázalo, že dva importy rxjs na začátku souboru jsou ve skutečnosti importovány ze dvou různých míst. Takže i když Subject rozšiřuje Observable, není to stejný Observable, který je importován a používán v mém souboru.
Pokoušel jsem se nainstalovat rxjs na úrovni kořenového projektu, kde se nachází soubor lerna.json. Ale ProjectB má závislost na webpack-cli, která má také tranzitivní závislost na rxjs, takže se stále instaluje do ProjectB.
Takže si nejsem úplně jistý, kam jít, nebo jestli je to chyba, nebo ne?
ProjectA interně používá Subject, takže se domnívám, že TypeScript prochází strom projektu a ukládá do mezipaměti, kde se co nachází, a to se v situaci, ve které jsem, pokazí.
Máte nějaké myšlenky nebo radu?
Odpověď č. 1
Podařilo se mi to opravit změnou pořadí mých importních příkazů. Věřím, že se jedná o chybu související se službou jazyka Typescript a způsobem, jakým ukládá věci do mezipaměti. Brzy podám nahlášení problému.
V podstatě jsem měl toto:
import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
Protože ProjectA odkazoval na Subject, jazyková služba to očividně ukládá do mezipaměti, takže když to importuji sám, používá odkaz, který už má.
Přesunutí importu ProjectA na konec vyřešilo problém:
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';
