web-dev-qa-db-fra.com

Le type «Abonnement» ne contient pas les propriétés suivantes du type «Observable <StringMap <any>>»

ERREUR: le type 'Abonnement' ne contient pas les propriétés suivantes du type 'Observable>': _isScalar, source, operator, lift et 6 more.ts (2740)

Ici, j'ai joint mon code.

Ici, dans mon cas, j'ai deux méthodes qui retournent un observable, mais getByTypeData et getByType. Mais, en renvoyant this.getByType (type) .. à partir de getByTypeData (), j'obtiens au-dessus de l'erreur.

P.S .: Je veux souscrire getByTypeData dans mon composant qui devrait me renvoyer un observable. ET JE SUIS NOUVEAU SUR RXJS ...


  /*
   interface IStringMap<T> {
        [index: string]: T;
    }
    */

    getByTypeData(type: string, ignoreApi = false): Observable<stringMap<any>> {
        if (ignoreApi) {
            this.handleConfig(type);
        }
        return this.getByType(type)
            .subscribe(response => {
                const config = response.result ? response.data : {};
                return this.handleConfig(type, config);
            });
    }

  // This method in another file (Just for reference)

    getByType(type: string): Observable<stringMap<any>> {
        return this.httpClient.get(`get url`);
    }

      handleConfig(type: string, config: stringMap<string | number> = {}): Observable<stringMap<any>> {
        if (type === this.types) {
            config.token = this.anotherservice.GetKey('mykey');
            if (config.token) {
                // logic
            }
        }

        if (type === this.types) {
            // logic
        }
        return of(config);
    }

1
TheDoozyLulu

Comme indiqué dans les commentaires, vous retournez un Subscription au lieu de renvoyer un Observable. Je vous suggère de lire la documentation pour avoir une bonne idée de la différence entre eux.

Dans votre cas particulier, je vous suggère plutôt d'essayer quelque chose comme ceci:

getByTypeData(type: string, ignoreApi = false): Observable<stringMap<any>> {
    if (ignoreApi) {
        return this.handleConfig(type);
    }
    return this.getByType(type).pipe(
        switchMap(response => {
            const config = response.result ? response.data : {};
            return this.handleConfig(type, config);
        })
    );
}

switchMap est un opérateur rxjs qui doit être importé avec une instruction comme celle-ci:

import { switchMap } from 'rxjs/operators'
  • La documentation sur cet opérateur peut être trouvée ici
  • Un bon article expliquant les opérateurs de mappage est ici
2
dmcgrandle