web-dev-qa-db-fra.com

L'argument de type «MonoTypeOperatorFunction <any>» n'est pas attribuable au paramètre de type «UnaryFunction <Observable <any>, Observable <any>>»

j'essaie de migrer de rxjs 5 à 6 mais j'ai des difficultés. quand j'essaye

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

je reçois cette erreur

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

Vous semblez avoir une importation incorrecte pour le type de retour isOnline(). Assurez-vous que vous importez toujours depuis rxjs et jamais depuis rxjs/internal Ou même rxjs/internal/Observable. (Les opérateurs comme first() doivent être importés de rxjs/operators)

5
ggradnig

J'ai trouvé la même erreur avec mon code:

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

TS2345: L'argument de type 'MonoTypeOperatorFunction' n'est pas attribuable au paramètre de type 'OperatorFunction'.

Pour résoudre ce problème, supprimez le type de la fonction de filtre

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

Vous avez maintenant une erreur

Le côté gauche d'une opération arithmétique doit être de type 'any', 'number', alors assurez-vous que ce filtre ennuyeux obtient le type de données correct

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

Mais maintenant, le code cesse de fonctionner. Enfin, pour résoudre ce problème, changez de à de, au début.

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

ou

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

Donc, la cause de l'erreur était ma structure de données initiale.

Je pense que mon exemple peut vous aider à résoudre des problèmes similaires.

6
Kamil Naja

J'ai eu une erreur similaire en utilisant pipe dans l'une des méthodes de services HTTP (voir l'exemple en bas). Le problème était le manque de saisie dans la fonction de rappel utilisée dans l'abonnement. Dans votre cas, ajoutez de la frappe (pas la meilleure idée mais même any) à state ou supprimez la parenthèse:

Solution 1:

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

Solution 2:

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

Pour en revenir à mon cas, j'ai utilisé un tuyau pour enregistrer les données. Il fallait définir deux types possibles sur l'observable, puis la fonction de rappel était possible:

  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

J'ai un tel problème, la première numérisation ne fonctionnait pas, j'ai donc changé

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

À

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

Ensuite, le problème était également que le Rxjs était également installé dans le dossier parent de cette application. Donc, en supprimant cela, je pense avoir résolu le problème.

Utiliser npm-check package est une bonne idée pour nettoyer le problème au niveau global et local des packages npm.

1
lingar