2016-07-31 29 views
3

Ich baue eine App mit Angular 2 mit Typescript. Welcher Rückgabetyp sollte mein Setter und Getter haben?Typescript-Rückgabetyp für Observables in Getter und Setter

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Events, SqlStorage, Storage } from 'ionic-angular'; 
import { Subject } from 'rxjs/Subject'; 


export interface User { 
    name?: string, 
    email?: string, 
    gender?: string, 
    picture?: Object 
} 

export interface DataStore { 
    user: User 
} 

@Injectable() 
export class UserService { 

    private storage: Storage; 
    private _user$: Subject<User>; 
    private dataStore: DataStore; 

    constructor(
    private http: Http 
) { 
    this.storage = new Storage(SqlStorage); 
    this._user$ = new Subject(); 
    this.dataStore = { user: {} }; 
    } 

    set user$(user: User) { 
    this.storage.set('user', JSON.stringify(user)); 
    this.dataStore.user = user; 
    this._user$.next(this.dataStore.user); 
    } 

    get user$() { 
    const subject = this._user$; 
    const source = subject.asObservable(); 
    return source; 
    } 

} 

Ich habe dies versucht:

set user$(user: User): void {} 
get user$(): Observable<User> {} 

Aber diese Fehler werfen:

TS2380 Fehler: 'get' und 'set' Accessor müssen denselben Typ haben. Fehler

TS1095: Ein 'Set' Accessor kann keine Rückgabetyp-Annotation haben. Fehler

TS2380: 'Get' und 'Set' Accessor müssen den gleichen Typ haben. Fehler

TS2322: Typ 'Benutzer' kann nicht dem Typ 'Observable' zugewiesen werden.

Fehler TS2322: Typ 'User' ist nicht belegbar

'beobachtbar' eingeben. Die Eigenschaft '_isScalar' fehlt im Typ 'Benutzer'.

Antwort

1

Ich denke, Sie sind fast da, aber ich frage mit dem Setter, zumindest in dem Code, den Sie bereitgestellt haben. Wenn Sie sich den Code in Ihrem Setter ansehen, setzen Sie nichts auf _user $.

Ich denke, das ist, was Sie stolpert, ich glaube nicht, dass Sie hier einen Setter verwenden sollten. Basierend auf dem, was der Code in Ihrem Setter tut, sollte dies nur eine öffentliche Funktion sein. Dies ist, was ich denke, es wie

constructor(private http: Http) { 
    this.storage = new Storage(SqlStorage); 
    this._user$ = new Subject(); 
    this.dataStore = { user: {} }; 
} 

setUser(user: User) { 
    this.storage.set('user', JSON.stringify(user)); 
    this.dataStore.user = user; 
    this._user$.next(this.dataStore.user); 
} 

get user$() { 
    return this._user$.asObservable(); 
} 

dann Ihre Komponente aussehen sollte, dass der Dienst verwendet wird, würde UserService.setUser (userObj) nennen.

get var(): User {} 
set var(user: User) {} 

Und

get var(): Observable<User> {} 
set var(user$: Observable<User>) {} 

eigentlich, dass sind die einzigen zulässigen Kombinationen:

+0

Danke, das macht Sinn! Ich habe andere ähnliche Beispiele gesehen, die keine Setter verwenden. –

2

Wenn Sie Fehlermeldungen folgen, werden Sie nur zwei Paare von Setter und Getter haben.