2016-11-28 14 views
1

リクエストURLに基​​づいてオブジェクトまたは同じオブジェクトの配列を返すメソッドがあります。論理は単純です。複数のタイプのObservableをTypescriptで返す

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

、ここでは私が扱うcouldntのエラーメッセージです。 enter image description here

答えて

4

一般的には、ブール値フラグを使用するのではなく、これを2つの方法に分割することをお勧めします。それはより簡単でより明確になり、あなたのタイピングの問題を無料で解決します。

本当にやりたくない場合は、function overloadをメソッドに追加します。これらを使用すると、この関数はフラグがfalseに設定された単一のユーザー、またはフラグがtrueに設定されている場合に多くのユーザーを常に返すことをTypeScriptに伝えることができます。あなたはこのすべてがどのように見える正確に何を見取得したい場合は、遊び場で

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'をタイプしても 'string []'型に割り当てられません。」 – spottedmahn

+0

@spottedmahnこれは意図的なものです - この関数を呼び出すコードの中の例を 'All Valid'(コンパイルする必要があります)と 'Invalid'(分割しないでください) –

+0

ああ、申し訳ありませんが、私は十分に近く読んでいませんでした。私はサンプルを開き、実行をクリックしました!明確化のためにありがとう! – spottedmahn

関連する問題