Skip to content

Instantly share code, notes, and snippets.

@ortense
Last active December 27, 2023 21:07
Show Gist options
  • Save ortense/f531eec73c12b9ec9cc72cd869ea2b73 to your computer and use it in GitHub Desktop.
Save ortense/f531eec73c12b9ec9cc72cd869ea2b73 to your computer and use it in GitHub Desktop.
Uso de Decoradores funcionais em projeto typescript

Uso de Decoradores funcionais em projeto typescript

Introdução

Proposta de adoção de decorators funcionaais em projetos typescript para melhorar a modularidade e flexibilidade do código. O padrão de decoradores permite adicionar comportamentos adicionais a funções existentes sem a necessidade de modificar diretamente o código dessas funções.

Padrão de Decoradores

O padrão de decorator é uma técnica de design que segue o princípio aberto/fechado do SOLID, permitindo a extensão de funcionalidades sem modificar o código existente. Os decorators funcionais são funções que envolvem outras funções para adicionar ou alterar comportamentos.

Implementação

Tipos Utilizados

type AnyFn = (...args: any) => any;
type DecoratedFn<Fn extends AnyFn> = (...args: Parameters<Fn>) => ReturnType<Fn>;
type DecoratorFn = <Fn extends AnyFn>(fn: Fn) => DecoratedFn<Fn>;

Implementação exemplo

function withTimer<Fn extends AnyFn> (fn: Fn): DecoratedFn<Fn> {
  return (...args: Parameters<Fn>) => {
    console.time(fn.name);
    const result: ReturnType<Fn> = fn(...args);
    console.timeEnd(fn.name);
    return result;
  };
}

Utilização de type alias

type WithTimer<Fn extends AnyFn> = DecoratedFn<Fn>

function withTimer<Fn extends AnyFn> (fn: Fn): WithTimer<Fn> {
  return (...args: Parameters<Fn>) => {
    console.time(fn.name)
    const result: ReturnType<Fn> = fn(...args)
    console.timeEnd(fn.name)
    return result
  }
}

type WithLogger<Fn extends AnyFn> = DecoratedFn<Fn>

function withLogger<Fn extends AnyFn> (fn: Fn): WithLogger<Fn> {
  return (...input: Parameters<Fn>) => {
    const output: ReturnType<Fn> = fn(...input)
    console.log({ fn: fn.name, input, output })
    return output
  }
}

screenshot do vscode exibindo a inferencia de tipo

Justificativa

A adoção do padrão de decoradores proporciona os seguintes benefícios para o Projeto X:

  • Flexibilidade: Permite adicionar facilmente funcionalidades adicionais a funções existentes.
  • Legibilidade: Torna o código mais legível ao isolar comportamentos específicos em decoradores.
  • Manutenção: Facilita a manutenção e extensão do código sem alterar a lógica original.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment