我花了好几个小时绕圈子,所以是时候再讨论一个模糊不清的问题了。
我在lerna
单声道回购中,有两个子项目,ProjectA
和ProjectB
。
ProjectA
依赖于rxjs
,ProjectB
也是如此。
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
,所以我怀疑打字稿正在走项目树并缓存每个事物的位置,这就是我所处的情况。
有任何想法或建议吗?
答案 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';