getter和setter中Observables的Typescript返回类型

时间:2016-07-31 03:42:39

标签: typescript angular ecmascript-6 getter-setter observable

我正在使用带有Typescript的Angular 2构建一个应用程序。我的setter和getter应该有什么返回类型?

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

}

我试过这个:

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

但抛出这些错误:

  

错误TS2380:'get'和'set'访问者必须具有相同的类型。错误

     

TS1095:'set'访问器不能有返回类型注释。错误

     

TS2380:'get'和'set'访问者必须具有相同的类型。错误

     

TS2322:类型'用户'不能指定为'可观察'类型。

     

错误TS2322:类型'用户'不能分配给类型

     

'可观测'。 “用户”类型中缺少属性“_isScalar”。

2 个答案:

答案 0 :(得分:4)

当您关注错误消息时,您将只有两对setter和getter:

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

并且

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

实际上这是唯一允许的组合。

答案 1 :(得分:1)

我认为你几乎就在那里,但我对使用setter提出质疑,至少在你提供的代码中是这样。当你查看setter中的代码时,你实际上没有为_user $设置任何内容。

我认为这就是绊倒你,我不认为你应该在这里使用二传手。根据代码在setter中的作用,这应该只是一个公共函数。这就是我认为它应该是什么样的

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

然后使用该服务的组件将调用UserService.setUser(userObj)。