Decorators e Propriedades

Exemplo


class ContaBancaria{
    @validacao()
    public _saldo: number;

    constructor(saldo: number){
        this._saldo = saldo
    }

    public sacar(valor: number){
        this._saldo -= valor;
        console.log('saque realizado');
    }

    public get saldo() : number {
        return this._saldo;
    }

}

function validacao(){
    return function(target: any, nomeDaPropriedade: string){
        //console.log(`Atributo=> ${nomeDaPropriedade}`)

        let val = target[nomeDaPropriedade];

        let getter = () => val;

        let setter = (value: number) => {
            if (value < 0){
                throw new Error('Valor negativo....')
            }else{
                val = value
            }
        }

        Object.defineProperty(target, nomeDaPropriedade,{
            get: getter,
            set: setter
        })
    }
}

let conta = new ContaBancaria(100);

try{
    conta._saldo = -200

}catch(e){
    console.log(e.message);
}finally{
    console.log(conta.saldo);
}

conta.sacar(30);

Versão 5.3 - Todos os Direitos reservados