簡體   English   中英

getter 和 setter 中 Observables 的 Typescript 返回類型

[英]Typescript return type for Observables in getter and setter

我正在使用 Angular 2 和 Typescript 構建一個應用程序。 我的 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”。

我想你快到了,但我質疑使用 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)。

當您遵循錯誤消息時,您將只有兩對 setter 和 getter:

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

並且

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

實際上,這是唯一允許的組合。

暫無
暫無

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

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