2016-11-28 60 views
1

我有一種方法可以根據請求url返回一個對象或一個包含相同對象的數組。邏輯很簡單;在Typescript中返回多種Observable類型

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)}); 
    } 
} 

,這裏是錯誤消息我想不出手柄; enter image description here

回答

4

一般來說,我建議做的實際上是將它分成兩個方法,而不是使用布爾標誌。這將更簡單,更清晰,並且也將免費解決您的打字問題。

如果你真的不想這樣做,那麼你會想爲你的方法添加function overload。通過這些,你可以告訴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()); 
} 

我已經把a working example在操場上,如果你想看到什麼這一切的樣子。

請注意,這確實保留了它仍然存在的潛在歧義。即如果您使用布爾值調用getUsers,並且在編譯時TypeScript不知道它是true還是false,它仍然會返回Observable<User | User[]>。您必須使用任何類型斷言或類型警衛來獲取正確的類型 - 如果您不熟悉這些內容,請查閱手冊中的Type Guards and Differentiating Types部分。

+0

該工作示例似乎並未編譯:「類型'字符串'不可分配爲鍵入'string []'」。 – spottedmahn

+0

@spottedmahn這是故意的 - 請注意代碼中的註釋在底部調用這個函數,將示例分爲'All Valid'(應該編譯)和'Invalid'(各種不適用的示例,不應該) –

+0

哦,對不起,我沒有讀得夠近。我剛打開這個例子並點擊運行!謝謝澄清! – spottedmahn

相關問題