Pesquisa de site

Getter e setter do Angular Typescript retornando Undefined


Eu tenho uma classe onde eu preciso que uma propriedade nessa classe retorne alguns campos em um objeto. Eu já fiz isso algumas vezes em .Net, mas no Angular, estou lutando com um "Undefined" sendo retornado.

Posso confirmar que as propriedades (transLanguageId, transLangDesc, translation) estão preenchidas no IBatchFile, mas não estão retornando no GET. Nem mesmo um console.log aparece no GETTER. Presumo que o código do GETTER não esteja sendo acionado.

O que estou perdendo aqui?

Agradeço antecipadamente pela sua ajuda.

modelo.ts

export class translationItem {  
  id: number;
  language: string;
  translation: string; 
}

export class IBatchFile {
  constructor(_transData: translationItem) {
    this._transData = new translationItem();
  }
  private _transData: translationItem;

  get transData(): translationItem {      
    this._transData.id = this.transLanguageId;
    this._transData.language = this.transLangDesc;
    this._transData.translation = this.translation;     
    return this._transData;
  };
  set transData(value: translationItem) {
     this._transData.id = value.id;
     this._transData.language = value.language;
     this._transData.translation = value.translation;
  };
  transLanguageId: number;
  transLangDesc: string;
  translation: string;
}

batchdocList.ts

private _batchFileListResults$ = new BehaviorSubject<IBatchFile[]>([]);

public loadDocList(batchid) {
  this.urlservice.getBatchFiles(batchid)         
  .subscribe(result => {      
    this._batchFileListResults$.next(result); //**result is of class IBatchFile**        

    this._batchFileListResults$.value.forEach(item => {          
      console.log(item.transData);  //**returns Undefined**
    });
}

url.service.ts

getBatchFiles(batchId: number) {             
        return this.dataservice.getBatchFiles(config.resources.Api.gatewayUri + config.resources.Api.getBatchFiles+"/"+batchId);
     }

data.service.ts

getBatchFiles(url:string): Observable<IBatchFile[]> {        
        return this.http.get<IBatchFile[]>(url)
        .pipe(map(response => response))
        .pipe(catchError(this.handleError));
    }

Resposta #1

Assumindo que:

  • você está usando HttpClient (@angular/common/http):
  • você tem class X

você precisa saber que é importante saber que http.get<X> não retorna uma instância da classe X.

Os campos estão preenchidos corretamente, mas a cadeia de protótipos não está. Você pode testar isso sozinho (no DevTools do seu navegador):

result.constructor  //ƒ Object()

Compare com:

const x = new X();
x.constructor       //class X

Assim, quaisquer itens que sejam colocados no protótipo do objeto (como métodos e acessadores get/set) estão ausentes no objeto resultado.

No meu projeto, restrigi os tipos de retorno de HttpClient.get para tipos (type X em vez de class X). Como os tipos são removidos na compilação, você evitará esse tipo de estranheza.

Alternativamente, você pode transformar a saída de HttpClient.get e instanciar classes reais via construtor.