类型 '() => Observable<any>' 上不存在属性 'subscribe'

Posted

技术标签:

【中文标题】类型 \'() => Observable<any>\' 上不存在属性 \'subscribe\'【英文标题】:Property 'subscribe' does not exist on type '() => Observable<any>'类型 '() => Observable<any>' 上不存在属性 'subscribe' 【发布时间】:2017-10-20 21:09:41 【问题描述】:

服务文件

import  Observable  from 'rxjs/Rx';
import  Http,Response from '@angular/http';
import  Injectable  from '@angular/core';
import 'rxjs/add/operator/Map';

@Injectable()
export class VideoService 

   private geturl = '/api/videos';
   constructor(private _http:Http)  

   getvideos() 
       return this._http.get(this.geturl).map((response:Response) => 
          response.json()
       );
   

这里是显示这个错误的订阅方法

import  VideoService  from '../video.service';
import  Component, OnInit  from '@angular/core';
import  Video  from '../video';
import  Observable  from 'rxjs/Observable';


@Component(
    selector: 'app-videocenter',
    templateUrl: './videocenter.component.html',
    styleUrls: ['./videocenter.component.css']
)
export class VideocenterComponent implements OnInit 
    videos: any;
    onselectvideo: Video;
    switch: boolean = false

    constructor(private videoserv: VideoService) 
        //console.log(this.videos);
    
    onselect(vid: any) 
        this.switch = true;
        this.onselectvideo = vid;
        console.log(vid);
    
    ngOnInit() 
         this.videos = this.videoserv.getvideos .subscribe((response) => 
             this.videos = response;
         );
    


我有一个服务文件,我必须在其中调用我的 api 来获取 api,当我要订阅另一个类中的方法时,我正在调用该服务方法 getvideos() 然后它显示该属性的错误类型 ()=> observable 上不存在“订阅”

【问题讨论】:

另外,switch 是一个受保护的字。您将无法将其用作变量名。 我得到属性 'map' 在类型 'string' 上不存在。在此:返回 this._http.get(this.geturl).map((response:Response) => response.json() ); 【参考方案1】:

您没有调用getVideos 方法。您在 getVideos 的函数引用上调用 subscribe 而不是返回值。拨打getVideos()后拨打subscribe

ngOnInit() 
    this.videoserv.getvideos().subscribe((response) => 
         this.videos = response
    );

【讨论】:

【参考方案2】:
ngOnInit() 
    this.videoserv.getvideos().subscribe((response) => 
         this.videos = response
    );

您应该在videoserv 服务上调用getvideos() 方法。 你错过了()getvideos 是一个方法而不是一个属性。

【讨论】:

【参考方案3】:

但是,如果您还想在应用程序的另一个位置(组件、管道...等)使用您的服务方法 getvideos()

你可以用 .pipe(map()) 代替 .subscribe()

ngOnInit() 
    this.videoserv.getvideos().pipe(map(response) => 
         this.videos = response
    ));

然后在你想放视频的地方使用.subscribe

   this.videoserv.getvideos().subscribe(response) => 
         this.videos2 = response
    );

【讨论】:

【参考方案4】:
this.service.method().subscribe(response)...

每当输入this.service 并出现自动建议时,在建议中,建议方法名称,一旦建议被接受,它只占用不带括号()的方法名称。

this.service.method.subscribe().. => 会报错

this.service.method().subscibe().. => 正确

【讨论】:

以上是关于类型 '() => Observable<any>' 上不存在属性 'subscribe'的主要内容,如果未能解决你的问题,请参考以下文章

类型 'Observable<any>' 不可分配给类型 'Observable<T>'

类型 'Observable<ArrayBuffer>' 不可分配给类型 'Observable<HttpResponse<User>>'

错误 TS2416 类型 'Observable<APIResponse>' 不可分配给类型 'Observable<User>'

Observable<> 不可分配给类型 Observable<SomeType[]>

无法将 Observable<Store> 类型的类型值转换为预期的参数类型 Observable<Store?>

如何组合多个 Observable 类型数组 Observable<T[]>?