馃 Decorators, Composition (composici贸n)

Se pueden aplicar m煤ltiples decoradores a una declaraci贸n, por ejemplo en una sola l铆nea:

@f @g x

O en l铆neas m煤ltiples:

@f
@g
x

Cuando m煤ltiples decoradores se aplican a una declaraci贸n sencilla, su valor es similar a una funci贸n de composici贸n en Matem谩ticas. En este modelo las funciones f y g, el resultado de la composici贸n es (f * g)(x) es equivalente a f(g(x)).

Por ello, la forma en la que se eval煤an los decoradores es la siguiente:

  1. La expresi贸n para cada decorador es evaluada de arriba hacia abajo.
  2. Los resultados son entonces invocados como funciones de abajo hacia arriba.

Si vamos a utilizar fabricas de decoradores, podemos observar el orden de esta evaluaci贸n con el siguiente ejemplo.

function f1() {
  console.log("f1 evaluada");
  return function (
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    console.log("f1 ejecutada");
  };
}

function f2() {
  console.log("f2 evaluada");
  return function (
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    console.log("f2 ejecutada");
  };
}

class ClaseEjemplo {
  @f1()
  @f2()
  saludar() {}
}

Salida…

f1 evaluada
f2 evaluada
f2 ejecutada
f1 ejecutada

馃嵖 Evaluaci贸n de los decoradores

El orden en el que los decoradores es aplicado es el siguiente.

  1. Decoradores de par谩metros (decoradores de par谩metros), seguidos por Method Accesors o Decoradores de Propiedades son aplicados a cada instancia de cada miembro.
  2. Decoradores de par谩metros, seguido por Method Accesors, o Decoradores de Propiedades son aplicados a cada miembro est谩tico.
  3. Decoradores de par谩metros, son aplicados al constructor.
  4. Decoradores de clases son aplicados a las clases.