馃敟 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.