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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Typescript模块在同一个文件中以不同方式解析'rxjs'相关的知识,希望对你有一定的参考价值。

我花了好几个小时绕圈子,所以有时间去讨论另一个模糊的问题。

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

ProjectA依赖于rxjsProjectB也是如此。

ProjectB依赖于ProjectAlerna通过使用符号链接进行管理。

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

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

在该文件中,有一个类有一个私有变量,它是一个Subject,它将它暴露为Observable。但是,tsc抱怨以下错误:

类型'Subject<ActionRequestResult<any>>'不能指定为'Observable<ActionRequestResult<any>>'类型。属性'source'受到保护,但类型'Observable<T>'不是源自'Observable<T>'的类。

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

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

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

ProjectA在内部使用Subject,所以我怀疑打字稿是在项目树上行走并缓存每个东西的位置,这在我所处的情况下是打破的。

有什么想法或建议吗?

答案

管理通过切换我的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';

以上是关于Typescript模块在同一个文件中以不同方式解析'rxjs'的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 中以编程方式解压缩文件

如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?

为啥我不能在 TypeScript 中以这种方式只读数组?

在 iOS 中以编程方式压缩和解压缩文件?

TypeScript 声明文件全解析

typescript 中不同 GraphQL 语法的优缺点