1
resposta

[Sugestão] Observação:

Esse codigo estava dando errado por causa do this.constructor.name.

export function escapar(
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) {
  const modeloOrigial = descriptor.value;
  descriptor.value = (...args: any[]) => {
    let retorno = modeloOrigial.apply(this, args);
    if (typeof retorno === "string") {
      console.log(
        `@escape em ação na classe ${this.constructor.name} para metodo ${propertyKey}`
      );
      retorno = retorno.replace(/<script>[\s\S]*?<\/script>/, "");
    }
    return retorno;
  };
  return descriptor;
}

Aí eu troquei o this por target e código voltou a funcionar.

console.log(
        `@escape em ação na classe ${target.constructor.name} para metodo ${propertyKey}`
      );
1 resposta

Oi Carlos, tudo bem?

Muito obrigada por compartilhar sua experiência, isso pode ajudar muitas pessoas!

A alteração que você fez no código faz todo sentido. No contexto de um decorator, o this não se refere à instância da classe onde o método decorado está sendo executado, mas sim ao contexto do próprio decorator.

Por isso, quando você tentou acessar this.constructor.name o código estava dando errado, pois estava tentando acessar o nome do construtor do decorator, não da classe onde o método decorado está.

Ao substituir this por target, você acertou o contexto, pois target é o parâmetro que recebe a referência para o objeto que contém o método que está sendo decorado. Assim, target.constructor.name corretamente retorna o nome da classe onde o método decorado está.

Um abraço e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software