web-dev-qa-db-ja.com

タイプ 'MonoTypeOperatorFunction <any>'の引数は、タイプ 'UnaryFunction <Observable <any>、Observable <any >>'のパラメーターに割り当てることができません

rxjs 5から6に移行しようとしていますが、問題があります。私がこれを試すとき

this._connectivity.isOnline().pipe(first()).subscribe((state) => {
  this.syncCheck(user.uid);
});

このエラーが発生しています

Argument of type 'MonoTypeOperatorFunction<any>' is not assignable to parameter of type 'UnaryFunction<Observable<any>, Observable<any>>'.
  Types of parameters 'source' and 'source' are incompatible.
    Type 'import("/home/User/Desktop/projectname/node_modules/rxjs/Observable").Observable<any>' is not assignable to type 'import("/home/User/Desktop/projectname/node_modules/rxjs/internal/Observable").Observable<a...'.
      Property 'map' is missing in type 'Observable<any>'.
7
Yushin

isOnline()戻り型のインポートが間違っているようです。必ずrxjsからインポートし、_rxjs/internal_または_rxjs/internal/Observable_からもインポートしないようにしてください。 (first()のような演算子は_rxjs/operators_からインポートする必要があります)

5
ggradnig

私のコードで同じエラーが見つかりました:

let source = of([1, 2, 3, 45, 56, 7, 7])
    .pipe(
        filter((x: number) => x % 2 == 0)
    );

TS2345:タイプ 'MonoTypeOperatorFunction'の引数は、タイプ 'OperatorFunction'のパラメーターに割り当てることができません。

これを修正するには、フィルター関数から型を削除してください

 filter(x => x % 2 == 0)

今、あなたはエラーがあります

算術演算の左側は「any」、「number」型でなければならないため、この迷惑なフィルターが正しいデータ型を取得することを確認してください

filter(x => Number(x) % 2 == 0) // parse element to number

しかし、現在、コードは動作を停止します。最後に、これを修正するには、最初にtoを変更します。

let source = from([1, 2, 3, 45, 56, 7, 7])
    .pipe(
        filter((x: number) => Number(x) % 2 === 0)
    )

または

let source = of(1, 2, 3, 45, 56, 7, 7)
.pipe(
        filter((x: number) => Number(x) % 2 === 0)
    )

そのため、エラーの原因は最初のデータ構造でした。

私の例は、同様の問題に対処するのに役立つと思います。

6
Kamil Naja

HTTPサービスメソッドの1つでパイプを使用すると同様のエラーが発生しました(下部の例を参照)。問題は、サブスクライブで使用されるコールバック関数の入力不足でした。あなたの場合、タイプを追加する(最良のアイデアではなく、any)をstateに追加するか、括弧を削除します。

解決策1:

this._connectivity.isOnline()
  .pipe(first()).subscribe((state: any) => {
    this.syncCheck(user.uid);
});

解決策2:

this._connectivity.isOnline()
  .pipe(first()).subscribe(state => {
    this.syncCheck(user.uid);
});

私の事例に戻って、パイプを使用してデータのログを記録しました。 observableに2つの可能なタイプを設定する必要があり、コールバック関数を入力することができました。

  public getPrice(): Observable<string | PriceDTO> {
    return this.http.get<PriceDTO>(`api/price)
      .pipe(
        tap((data: PriceDTO) => console.log('PRICE: ', data)),
        catchError((val: Error) => of(`I caught: ${val}`))
      );
  }
2
mpro

このような問題があり、最初のスキャンが機能していなかったため、変更しました

  .pipe(scan((count ) => count + 1, 0))...

  .pipe(scan((count:any ) => count + 1, 0))

また、問題は、Rxjsがこのアプリの親フォルダーにもインストールされたことでした。これを削除すると、問題は解決したと思います。

npm-check packageを使用することは、npmパッケージのグローバルレベルとローカルレベルのどちらかの問題をクリーニングするのに適しています。

1
lingar