Javascript 类型脚本模块解析';rxjs';在同一个文件中不同
我花了几个小时兜圈子,所以是时候问另一个模糊的问题了 我在一个Javascript 类型脚本模块解析';rxjs';在同一个文件中不同,javascript,typescript,npm,rxjs,Javascript,Typescript,Npm,Rxjs,我花了几个小时兜圈子,所以是时候问另一个模糊的问题了 我在一个lernamono回购项目中,有两个子项目,ProjectA和ProjectB ProjectA与ProjectB一样依赖于rxjs ProjectB依赖于ProjectA,而lerna使用符号链接进行管理 问题是,在ProjectB中,我有一个文件执行以下导入: import { Subject } from 'rxjs/Subject' import { Observable } from "rxjs/Observable";
lerna
mono回购项目中,有两个子项目,ProjectA
和ProjectB
ProjectA
与ProjectB
一样依赖于rxjs
ProjectB
依赖于ProjectA
,而lerna
使用符号链接进行管理
问题是,在ProjectB
中,我有一个文件执行以下导入:
import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";
在该文件中,有一个类有一个私有变量,它是主题
,并将其公开为一个可观察的
。但是,tsc抱怨出现以下错误:
类型“Subject
”不可分配给类型“Observable
”。
属性“source”受保护,但类型“Observable
”不是从“Observable
”派生的类
经过调查,发现文件顶部的两个rxjs
导入实际上是从两个不同的位置导入的。因此,即使Subject
扩展了Observable
,但在我的文件中导入和引用的Observable
并不相同
我试图在根项目级别安装rxjs
,即lerna.json
文件所在的位置。但是ProjectB
依赖于webpackcli
,后者也依赖于rxjs
,因此它仍然可以安装到ProjectB
中
所以我不确定该去哪里,或者这是否是一个bug
ProjectA
在内部使用Subject
,因此我怀疑typescript正在项目树中遍历并缓存每个东西,这在我所处的情况下是一种破坏
有什么想法或建议吗?通过切换导入语句的顺序,设法解决了这个问题。我相信这是一个与Typescript语言服务及其缓存方式有关的bug。我将很快提交一个问题 基本上,我有这样的想法:
import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
因为ProjectA
引用了Subject
,所以语言服务显然会缓存它,所以当我自己导入时,它会使用它已经拥有的引用
将项目A
导入移到末尾解决了问题:
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';
通常,通过配置tsconfig.json路径参数可以解决此类问题