javascript - Typescript resolviendo módulos de 'rxjs' de manera diferente en el mismo archivo
He pasado horas dando vueltas en círculos, así que es hora de otra pregunta oscura.
Estoy dentro de un mono repositorio lerna, con dos subproyectos, ProjectA y ProjectB.
ProjectA tiene una dependencia de rxjs, al igual que ProjectB.
ProjectB tiene una dependencia de ProjectA que lerna gestiona utilizando enlaces simbólicos.
El problema es que, en ProjectB, tengo un archivo que realiza las siguientes importaciones:
import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";
En ese archivo, hay una clase que tiene una variable privada que es un Subject, y la expone como un Observable. Sin embargo, tsc se está quejando con el siguiente error:
El tipo '
Subject<ActionRequestResult<any>>' no se puede asignar al tipo 'Observable<ActionRequestResult<any>>'. La propiedad 'source' está protegida pero el tipo 'Observable<T>' no es una clase derivada de 'Observable<T>'.
Después de investigar, resulta que las dos importaciones de rxjs en la parte superior del archivo en realidad se están importando desde dos ubicaciones diferentes. Así que, aunque Subject extiende Observable, no es el mismo Observable que se está importando y referenciando en mi archivo.
Intenté instalar rxjs en el nivel raíz del proyecto, donde se encuentra el archivo lerna.json. Pero ProjectB tiene una dependencia de webpack-cli que a su vez tiene una dependencia transitiva de rxjs, así que todavía se instala en ProjectB.
Así que no estoy exactamente seguro de a dónde ir, o si esto es un error o no.
ProjectA usa Subject internamente, así que sospecho que TypeScript está recorriendo el árbol del proyecto y almacenando en caché dónde está cada cosa, y esto se está rompiendo en la situación en la que me encuentro.
¿Alguna idea o consejo?
Respuesta #1
Logré solucionarlo cambiando el orden de mis declaraciones de importación. Creo que este es un error relacionado con el servicio de lenguaje de Typescript y la forma en que está almacenando en caché las cosas. Enviaré un informe de problema pronto.
Básicamente, tuve esto:
import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
Debido a que ProjectA hacía referencia a Subject, el servicio de lenguaje evidentemente lo almacena en caché, así que cuando lo importo yo mismo, utiliza la referencia que ya tiene.
Mover la importación de ProjectA al final resolvió el problema:
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';
