web-dev-qa-db-ja.com

タイプ 'Subscription'には、タイプ 'Observable <StringMap <any >>'の次のプロパティがありません

エラー:タイプ 'サブスクリプション'には、タイプ 'Observable>'の次のプロパティがありません:_isScalar、source、operator、lift、およびその他6つ。ts(2740)

ここにコードを添付しました。

ここでは、私の場合、オブザーバブルを返す2つのメソッドがありますが、getByTypeDataとgetByTypeです。しかし、this.getByType(type)..をgetByTypeData()から返すと、エラーが発生します。

PS:オブザーバブルを返すコンポーネントでgetByTypeDataをサブスクライブしたい。そして、私は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

コメントで指摘されているように、Subscriptionを返す代わりにObservableを返しています。 ドキュメント を読んで、それらの違いをよく理解することをお勧めします。

あなたの特定のケースでは、代わりに次のようなものを試すことをお勧めします:

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は、次のようなステートメントでインポートする必要があるrxjs演算子です。

import { switchMap } from 'rxjs/operators'
  • この演算子のドキュメントは次の場所にあります here
  • マッピング演算子を説明する良い記事は here です。
2
dmcgrandle