javascript - Typescript-moduuli ratkaisee 'rxjs':n eri tavalla samassa tiedostossa
Olen käyttänyt tunteja pyöriessäni ympyrää, joten nyt on aika toiselle hämärälle kysymykselle.
Olen sisällä lerna monorepossa, jossa on kaksi aliprojektia, ProjectA ja ProjectB.
ProjectA riippuu rxjs:stä, samoin kuin ProjectB.
ProjectB on riippuvainen ProjectA:sta, jota lerna hallitsee käyttämällä symbolisia linkkejä.
Ongelma on, että ProjectB-projektissa minulla on tiedosto, joka tekee seuraavat tuonnit:
import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";
Tuossa tiedostossa on luokka, jolla on yksityinen muuttuja, joka on Subject, ja se paljastaa sen Observablena. Kuitenkin tsc valittaa seuraavan virheen kanssa:
Tyyppi '
Subject<ActionRequestResult<any>>' ei ole määriteltävissä tyypiksi 'Observable<ActionRequestResult<any>>'. Ominaisuus 'source' on suojattu, mutta tyyppi 'Observable<T>' ei ole luokka, joka on peritty tyyppistä 'Observable<T>'.
Tutkimisen jälkeen käy ilmi, että kaksi tiedoston yläosassa olevaa rxjs-importtia tuodaan itse asiassa kahdesta eri paikasta. Joten vaikka Subject laajentaa Observable-luokkaa, se ei ole sama Observable, jota tuodaan ja johon viitataan tiedostossani.
Yritin asentaa rxjs-paketin juuritason projektiin, jossa lerna.json-tiedosto sijaitsee. Mutta ProjectB-projektilla on riippuvuus webpack-cli-pakettiin, jolla on myös välillinen riippuvuus rxjs-pakettiin, joten se asennetaan silti ProjectB-projektiin.
Joten en ole aivan varma, minne mennä, tai onko tämä virhe vai ei?
ProjectA käyttää sisäisesti Subject-objektia, joten epäilen, että TypeScript käy läpi projektipuun ja välimuistittaa, missä kukin asia on, ja tämä aiheuttaa ongelmia tilanteessa, jossa olen.
Mitä ajatuksia tai neuvoja?
Vastaus #1
Onnistuin korjaamaan sen vaihtamalla tuontilauseideni järjestystä. Uskon, että tämä on bugi, joka liittyy Typescriptin kielipalveluun ja siihen, miten se välimuistaa asioita. Ilmoitan asiasta pian.
Pohjimmiltaan minulla oli tämä:
import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
Koska ProjectA viittasi Subject-kohteeseen, kielipalvelu selvästi välimuisti sen, joten kun tuon sen itse, se käyttää jo olemassa olevaa viitettä.
Siirtämällä ProjectA-tuonti loppuun ongelma ratkesi:
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';
