类型“ Subscription”缺少类型“ Observable <StringMap <any >>”中的以下属性

时间:2019-08-30 12:52:36

标签: javascript angular rxjs observable subscription

  

错误:类型'Subscription'缺少以下属性   输入'Observable>':_isScalar,来源,运算符,提升,   还有6个。ts(2740)

我在这里附加了我的代码。

在我的情况下,我有两个方法返回可观察到的值,但有getByTypeData和getByType。但是,从getByTypeData()返回this.getByType(type)..时,我遇到了以上错误。

P.S .:我想在组件中订阅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 个答案:

答案 0 :(得分:1)

如注释中所指出,您将返回Subscription而不是返回Observable。我建议您阅读documentation以便更好地了解它们之间的区别。

在您的特定情况下,建议您改用以下方法:

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
  • 是一篇很好的说明映射运算符的文章