3
respostas

Tipo para a função constructor de uma classe

Olá, gente. Primeiro eu queria parabenizar vocês pelos cursos e mostrar meu interesse por mais conteúdo em typescript. Eu não sei se já existe, mas também seria interessante cursos focados em arquitetura de software com typescript (eu vi que têm para php e c#)

Bom, mas a dúvida seria em relação ao decorator de uma classe.

Nessa lição, o professor passou o seguinte exemplo:

export function meuDecoratorDeClasse() {
    return function(constructor: any) {
        const original = constructor;

        const novo: any = function (...args: any[]) {
            console.log("Criando uma instância com New: " + original.name); 
            return new original(...args);
        }

        novo.prototype = original.prototype;
        return novo;
    }
}

Ele usou o tipo any para o constructor. Mas e se eu quisesse deixar explícito que a função recebe um constructor, teria um tipo para isso? Eu criei um tipo baseado em um exemplo na internet mas queria ver outras soluções com vocês.

Meu exemplo:

class _Class { constructor(...args: any[]){} }
type Class<T = {}> = typeof _Class & {prototype: T};

export function meuDecoratorDeClasse (): Function {
  return function (constructor: Class) {
    const original = constructor;

    const novo = function (...args: any[]) {
      console.log(`Nova instância de ${original.name}`);
      return new original(...args);
    }

    novo.prototype = original.prototype;
    return novo;
  }
}

EDIT: E o retorno dessa função novo seria de qual tipo? Eu revi o meu exemplo e coloquei o retorno como sendo da classe _Class que eu criei:

const novo = function (...args: any[]): _Class {
      console.log(`Nova instância de ${original.name}`);
      return new original(...args);
    }

Após a alteração o código continuou funcionando mas eu não sei o quão confiável ele é.

3 respostas

Fala ai Douglas, tudo bem? Muito bom, é uma solução boa, exitem N outras para isso, por exemplo:

Você também poderia utilizar o generic do TypeScript, ou seja, a ideia seria que quem for utilizar sua função seja o responsável por injetar o tipo de retorno.

Não tem certo ou errado e sim a que encaixa no contexto e resolve o problema abordado.

Espero ter ajudado e parabéns pelas pesquisas.

Entendi! Depois eu vou brincar um pouco mais com o generic nessa função. Tem o fato que esse tipo de decorator é só experimental também é talvez mude bastante a sintaxe (só chutando)

Valeu!

Boa Douglas, sempre que precisar não deixe de criar suas dúvidas.

Acho pouco provável que os decorators mude, já está quase no estágio final para entrar na spec.

Abraços e bons estudos.