类型“订阅”缺少类型“可观察<StringMap<any>>”中的以下属性

Posted

技术标签:

【中文标题】类型“订阅”缺少类型“可观察<StringMap<any>>”中的以下属性【英文标题】:Type 'Subscription' is missing the following properties from type 'Observable<StringMap<any>>' 【发布时间】:2020-01-03 17:32:25 【问题描述】:

错误:类型“订阅”缺少以下属性 输入“Observable>”:_isScalar、源、运算符、升降机、 还有 6 个.ts(2740)

这里我附上了我的代码。

在这里,在我的例子中,我有两个方法可以返回一个 observable,但是 getByTypeData 和 getByType。但是,从 getByTypeData() 返回 this.getByType(type).. 时,我遇到了上述错误。

P.S.:我想在我的组件中订阅 getByTypeData,它应该返回一个 observable。而且我是 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);
    

【问题讨论】:

你说你会返回一个 observable,但返回的是一个订阅。不要那样做。 嗨@jonrsharpe,你能详细解释一下吗。可能是通过我的代码?谢谢。 好吧,当你写 : Observable&lt;stringMap&lt;any&gt;&gt; 时,这意味着 “这个函数将返回一个 observable”,但随后 return this.getByType(type).subscribe(...) 返回一个 subscription,它不是可观察的。要么改变你说你要返回的东西,要么改变你正在返回的东西。 【参考方案1】:

正如 cmets 中所指出的,您返回的是 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

【讨论】:

以上是关于类型“订阅”缺少类型“可观察<StringMap<any>>”中的以下属性的主要内容,如果未能解决你的问题,请参考以下文章

Angular 订阅 - 类型 'Subscription' 缺少来自类型 'ToDo[]' 的以下属性:length、pop、push、concat 和另外 26 个

类型“订阅”不可分配给类型“订阅”

EventBus手写实现事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )

TypeScript 错误类型“”缺少类型中的以下属性

类型“未知 []”缺少“初始状态”类型的以下属性

类型“文档”缺少类型中的以下属性