簡體   English   中英

在Typescript中返回多種類型的Observable

[英]return multiple types of Observable within Typescript

我有一個方法,可以根據請求url返回一個對象或相同對象的數組。 邏輯很簡單;

myservice.service.ts:

private _url_User = "https://api.github.com/users/dummyuser";
constructor(private _http: Http){}

getUsers(followers?: boolean): Observable<User | User[]>{
        this._url_User += followers?"/followers":"";//if followers equals true edit url, this returns array of same user object
        return this._http.get(this._url_User).map(res=>res.json());
    }

mycomponent.component.ts:

import { Component,OnInit } from '@angular/core';
import {Auth} from '../../services/auth.service';
import {CommentService} from '../../services/comment.service';
import {User} from '../../infrastructure/user';

@Component({
    moduleId:module.id,
    selector: 'app-comment',
    templateUrl: '../../templates/comment.component.html'
})

export class CommentComponent implements OnInit{ 
    user:User;
    followers:User[];
    constructor(private auth: Auth, private commentService: CommentService){
    }
    ngOnInit(){
        this.commentService.getUsers().subscribe(d=>{ this.user=d[0]; console.log(this.user.email)});
        this.commentService.getUsers(true).subscribe(d=>{this.followers=d; console.log(this.followers[0].email)});
    }
}

這是我無法處理的錯誤消息; 在此處輸入圖片說明

通常,我建議您執行的操作實際上是將其分為兩種方法,而不是使用布爾標志。 整個過程將更加簡單明了,並且還將在此處免費解決您的打字問題。

如果您確實不想這樣做,則可以在方法中添加函數重載 有了這些,您可以告訴TypeScript該函數始終返回標志設置為false的單個用戶,或者如果標志設置為true則返回多個用戶,您將獲得所需的行為。

此函數的重載如下所示:

getUsers(): Observable<User>;
getUsers(followers: false): Observable<User>;
getUsers(followers: true): Observable<User[]>;
getUsers(followers?: boolean): Observable<User | User[]>{
    this._url_User += followers?"/followers":"";
    return this._http.get(this._url_User).map(res=>res.json());
}

如果您想確切了解所有這些情況,我在操場上整理了一個工作示例

請注意,這確實保留了仍然存在的潛在歧義。 即,如果您使用布爾值調用getUsers,並且在編譯時TypeScript不知道這是對還是錯,它仍然會返回Observable<User | User[]> Observable<User | User[]> 您必須使用類型斷言或類型保護來獲取正確的類型-如果您不熟悉該類型 ,請查閱手冊中的“ 類型保護和區分類型”部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM