Typescript模块在同一个文件中以不同方式解析'rxjs'

时间:2018-03-02 14:04:25

标签: javascript typescript npm rxjs

我花了好几个小时绕圈子,所以是时候再讨论一个模糊不清的问题了。

我在lerna单声道回购中,有两个子项目,ProjectAProjectB

ProjectA依赖于rxjsProjectB也是如此。

ProjectB依赖于ProjectA lerna使用符号链接进行管理。

问题是,在ProjectB中,我有一个执行以下导入的文件:

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

在该文件中,有一个类具有一个Subject的私有变量,并将其公开为Observable。但是,tsc抱怨以下错误:

  

类型“Subject<ActionRequestResult<any>>”无法指定为“Observable<ActionRequestResult<any>>”类型。     属性“来源”受到保护,但类型“Observable<T>”不是源自“Observable<T>”的类。

经过调查,结果发现文件顶部的两个rxjs导入实际上是从两个不同的位置导入的。因此,尽管Subject扩展了Observable,但它与我的文件中导入和引用的Observable不同。

我尝试在rxjs文件所在的根项目级别安装lerna.json。但ProjectB依赖于webpack-cli,它对rxjs也具有传递依赖性,因此它仍会安装到ProjectB

所以我不确定该去哪里,或者这是不是一个错误?

ProjectA在内部使用Subject,所以我怀疑打字稿正在走项目树并缓存每个事物的位置,这就是我所处的情况。

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

管理通过切换我的import语句的顺序来修复它。我相信这是一个与Typescript语言服务及其缓存方式相关的错误。我很快就会提交一个问题。

基本上,我有这个:

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

因为ProjectA引用了Subject,语言服务显然会缓存它,因此当我自己导入它时,它会使用它已有的引用。

ProjectA导入移至最终解决了问题:

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