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>'.
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
)
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.
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}`))
);
}
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.