3
respostas

Erro em "if (valorDoDebito > this.saldo)"

No meu projeto está dando erro ao comparar o valor do debito com "this.saldo". Mostra a mensagem dizendo que "saldo" não existe em "PropertyDescriptor".

Para contornar o erro tive que fazer desta forma:

if (valorDoDebito > (this as Conta).getSaldo()) {
      throw new Error("Seu saldo é insuficiente para realizar a operação!");
    }

Está correto isto?

3 respostas

A mensagem de erro mencionando "PropertyDescriptor" indica que pode haver um problema com a manipulação de propriedades em algum lugar do seu código. A "PropertyDescriptor" é uma interface em JavaScript que descreve as propriedades de um objeto.

Se você está tentando comparar o valor de "this.saldo" em um contexto específico (por exemplo, em uma classe ou objeto), certifique-se de que a propriedade "saldo" está corretamente definida nesse contexto. Verifique se:

A propriedade "saldo" está sendo inicializada de maneira apropriada no construtor ou em algum outro lugar no seu código. Você está referenciando corretamente o "this.saldo" dentro do escopo onde está fazendo a comparação. Em JavaScript, o uso do "this" pode variar dependendo do contexto (dentro de funções, classes, arrow functions, etc.). Aqui está um exemplo básico de uma classe em JavaScript que tem uma propriedade "saldo" e realiza uma comparação com "this.saldo":

class ContaBancaria {
  constructor(saldoInicial) {
    this.saldo = saldoInicial;
  }

  verificarSaldo(debito) {
    if (debito <= this.saldo) {
      console.log("Débito possível. Realizando operação.");
      // Outras operações aqui
    } else {
      console.log("Saldo insuficiente para o débito.");
    }
  }
}

// Exemplo de uso da classe
let minhaConta = new ContaBancaria(100); // Inicializando com saldo inicial de 100

minhaConta.verificarSaldo(50); // Saída: Débito possível. Realizando operação.
minhaConta.verificarSaldo(150); // Saída: Saldo insuficiente para o débito.

Certifique-se de que a propriedade "saldo" está sendo corretamente inicializada e que você está referenciando-a de forma adequada no seu código. Se possível, forneça mais detalhes ou trechos de código para que eu possa ajudar de forma mais específica.

O código é este. É um decorator usado para validar um método que recebe um valor a ser debitado de uma conta. A linha que está comentada, é como foi passado pela instrutora.

import { Conta } from "./Conta.js";

export function ValidaDebito(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
 
  descriptor.value = function (valorDoDebito: number) {
    if (valorDoDebito <= 0) {
      throw new Error("O valor a ser debitado precisa ser maior do que zero!");
    }
    // if (valorDoDebito > this.saldo) 
    if (valorDoDebito > (this as Conta).getSaldo()) {
      throw new Error("Seu saldo é insuficiente para realizar a operação!");
    }

    return originalMethod.apply(this, [valorDoDebito]);
  }

  return descriptor;
}

Aqui é o código da classe Conta completa, com o metodo "debitar()" sendo validado com o decorator:

import { Armazenador } from "./Armazenador.js";
import { ValidaDebito } from "./Decorators.js";
import { GrupoTransacao } from "./GrupoTransacao.js";
import { ResumoTransacoes } from "./ResumoTransacoes.js";
import { TipoTransacao } from "./TipoTransacao.js";
import { Transacao } from "./Transacao.js";

export class Conta {
  protected nome: string;
  protected saldo: number = Armazenador.obter<number>('saldo') || 0;
  
  //Aqui temos um exemplo da função opcional "reviver"
  private transacoes: Transacao[] = Armazenador.obter<Transacao[]>('transacoes', (key: string, value: string) => {
    if (key === 'data') {
      return new Date(value);
    }
    
    return value;
  }) || [];
  
  constructor(nome: string){
    this.nome = nome;
  }
  
  getSaldo(): number {
    return this.saldo;
  }
  
  getDataAcesso(): Date {
    return new Date();
  }
  
  getTitular(){
    return this.nome;
  }
  
  @ValidaDebito
  private debitar(valor: number) {
    this.saldo -= valor;
    Armazenador.salvar('saldo', this.saldo.toString());
  }
  
  private depositar(valor: number) {
    if (valor <= 0) {
      throw new Error('O valor deve ser maior que 0');
    }
    this.saldo += valor;
    Armazenador.salvar('saldo', this.saldo.toString());
  }

  getGrupoTransacoes(): GrupoTransacao[] {
    const gruposTransacoes: GrupoTransacao[] = [];
    const listaTransacoes: Transacao[] = structuredClone(this.transacoes)
    const transacoesOrdenadas: Transacao[] = listaTransacoes.sort((t1, t2) => t2.data.getTime() - t1.data.getTime());
    let dataAtualGrupoTransacao: string = "";

    for (let transacao of transacoesOrdenadas) {
      let dataGrupoTransacao: string = transacao.data.toLocaleDateString("pt-br", { month: "long", year: "numeric" });
      if (dataAtualGrupoTransacao !== dataGrupoTransacao) {
        dataAtualGrupoTransacao = dataGrupoTransacao;
        gruposTransacoes.push({
          data: dataGrupoTransacao,
          transacoes: []
        });
      }
      gruposTransacoes[gruposTransacoes.length - 1].transacoes.push(transacao);
    }

    return gruposTransacoes;
  }

  registrarTransacao(novaTransacao: Transacao): void {
    if (novaTransacao.tipoTransacao == TipoTransacao.DEPOSITO) {
      this.depositar(novaTransacao.valor);
    } else if (novaTransacao.tipoTransacao == TipoTransacao.TRANSFERENCIA || novaTransacao.tipoTransacao == TipoTransacao.PAGAMENTO_BOLETO) {
      this.debitar(novaTransacao.valor);
      novaTransacao.valor *= -1;               //Faz o número ficar negativo para aparecer o sinal de menos 
    } else {
      throw new Error('Tipo de Transação inválida');
    }

    this.transacoes.push(novaTransacao);    
    
    //Antes estava usando "JSON.stringify" para enviar as transacoes, mas como ele já é utilizado no "Armazenador", estava salvando errado
    Armazenador.salvar('transacoes', this.transacoes); //Converte para JSON
  }


  getResumoTransacoes(): ResumoTransacoes {

    const resumo: ResumoTransacoes = {
      quantidadeDepositos: 0,
      totalDepositos: 0,
      quantidadeTransferencias: 0,
      totalTransferencias: 0,
      quantidadePagBoletos: 0,
      totalPagamentosBoleto: 0,
      temResumo: false
    };

    for (let transacao of this.transacoes) {
      switch (transacao.tipoTransacao) {
        case TipoTransacao.DEPOSITO:
          resumo.temResumo = true;
          resumo.quantidadeDepositos++;
          resumo.totalDepositos += transacao.valor;
          break;

        case TipoTransacao.TRANSFERENCIA:
          resumo.temResumo = true;
          resumo.quantidadeTransferencias++;
          resumo.totalTransferencias += transacao.valor;
          break;

        case TipoTransacao.PAGAMENTO_BOLETO:
          resumo.temResumo = true;
          resumo.quantidadePagBoletos++;
          resumo.totalPagamentosBoleto += transacao.valor;
          break;
      }
    }

    return resumo;
  }

}

export class ContaPremium extends Conta{
  registrarTransacao(transacao: Transacao): void {
    if(transacao.tipoTransacao === TipoTransacao.DEPOSITO){
      console.log('Você ganhou um bônus de 0.50 centavos');
      transacao.valor += 0.5;
    }

    super.registrarTransacao(transacao);
  }
}

const conta = new Conta('Jorge');
const contaPremium = new ContaPremium('Larissa');
export default conta;