Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Decorator de Classe

Fui colocar o código do proposto pelo curso de criar um decorator de class conforme o exemplo:

export function meuDecoratorDeClasse() {

    return function(constructor: any) {

       // guarda o constructor original, pois iremos definir um novo
        const original = constructor;

       // cria um novo constructor. Como ele pode receber nenhum ou mais parâmetros, usamos ...args: any[]
        const novo = function (...args: any[]) {
            console.log("Criando uma instância com New: " + original.name); 
            // cria a instância da classe quando for chamado 
            return new original();
        }

       // importante! O prototype do novo constructor deve ser o mesmo do original
        novo.prototype = original.prototype;

        // retorna o novo constructor
        return novo;
    }
}

@meuDecoratorDeClasse()
export class NegociacaoController {
}

porem recebo esse erro no watch do typescript

app/ts/controllers/NegociacaoController.ts(5,1): error TS1238: Unable to resolve signature of class decorator when called as an expression.
[0]   Type '(...args: any[]) => any' is not assignable to type 'typeof NegociacaoController'.
[0]     Type '(...args: any[]) => any' provides no match for the signature 'new (): NegociacaoController'.

o que está errado.

2 respostas

Estou a caminho. Assim que chegar ao meu note verifico. Vai avançando com o curso porque esse decorator é um exemplo que não faz parte do projeto.

Mas fique tranquilo de descubro já já o problema.

solução!

Bom dia Niccolas! Eu esqueci de indicar o tipo do novo constructor criado. Ele precisa ser do tipo any.

Alterei já o exemplo. Vou colocar aqui no novo código e indicar a pequena mudança!

export function meuDecoratorDeClasse() {

    return function(constructor: any) {

        const original = constructor;
        // novo é any agora!
        const novo: any = function (...args: any[]) {
            console.log("Criando uma instância com New: " + original.name); 
            // também não tinha passado os parâmetros da classe caso a classe recebe algum.
            return new original(...args);
        }

        novo.prototype = original.prototype;

        return novo;
    }
}

Prontinho, só testar! Desculpe qualquer transtorno! Foi esquecimento de digitação mesmo.