javascript - 同じファイル内で Typescript モジュールが 'rxjs' を異なる方法で解決する
何時間も堂々巡りしてしまったので、また別の難しい質問の時間です。
私は lerna モノリポの中にいて、2つのサブプロジェクト、ProjectA と ProjectB があります。
ProjectA は rxjs に依存しており、ProjectB も同様です。
ProjectB は lerna がシンボリックリンクを使って管理する ProjectA に依存しています。
問題は、ProjectB で、次のインポートを行うファイルがあることです:
import { Subject } from 'rxjs/Subject'
import { Observable } from "rxjs/Observable";
そのファイルには、プライベート変数として Subject を持つクラスがあり、それを Observable として公開しています。しかし、tsc は次のエラーで文句を言っています:
型 '<code>Subject<ActionRequestResult<any>></code>' は型 '<code>Observable<ActionRequestResult<any>></code>' に割り当てることができません。プロパティ 'source' は保護されていますが、型 '<code>Observable<T></code>' は '<code>Observable<T></code>' から派生したクラスではありません。
調査したところ、ファイルの先頭にある2つの rxjs インポートは実際には異なる場所からインポートされていることが判明しました。ですので、Subject は Observable を拡張していますが、私のファイルでインポートされ参照されているのと同じ Observable ではありません。
私は lerna.json ファイルがあるルートプロジェクトレベルで rxjs をインストールしようとしました。しかし ProjectB は webpack-cli に依存しており、webpack-cli は rxjs にも推移的依存関係を持っているため、結局 ProjectB にもインストールされてしまいます。
だから、正確にどこに行けばいいのか、これがバグかどうかもよくわかりません。
`ProjectA` は内部で `Subject` を使用しているので、TypeScript がプロジェクトツリーを巡回して各要素の場所をキャッシュしており、私の置かれている状況ではこれが壊れているのではないかと疑っています。
何か意見やアドバイスはありますか?
回答 #1
インポート文の順序を変えることで修正できました。これは、TypeScript の言語サービスとそのキャッシュの仕組みに関連するバグだと思います。近いうちに問題を報告します。
基本的に、私はこれを持っていました:
import { Something } from 'ProjectA';
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
なぜなら、ProjectA が Subject を参照していたので、言語サービスは明らかにそれをキャッシュしており、私がそれを自分でインポートすると、すでに持っている参照を使用するからです。
<code>ProjectA</code> のインポートを最後に移動すると、問題が解決しました:
import { Subject } from 'rxjs/Subject';
import { Observable } from "rxjs/Observable";
import { Something } from 'ProjectA';
