Je suis en train de jouer avec des décorateurs de Typescript et ils semblent se comporter différemment de ce à quoi je m'attendais lorsqu'ils sont utilisés avec l'héritage de classe.Décorateurs dactylographiés avec héritage
Supposons que j'ai le code suivant:
class A {
@f()
propA;
}
class B extends A {
@f()
propB;
}
class C extends A {
@f()
propC;
}
function f() {
return (target, key) => {
if (!target.test) target.test = [];
target.test.push(key);
};
}
let b = new B();
let c = new C();
console.log(b['test'], c['test']);
qui sort:
[ 'propA', 'propB', 'propC' ] [ 'propA', 'propB', 'propC' ]
Bien que je m'y attendais:
[ 'propA', 'propB' ] [ 'propA', 'propC' ]
Ainsi, il semble que target.test
est partagée entre A, B et C. Et ma compréhension de ce qui se passe ici est la suivante:
- Puisque B étend A,
new B()
déclenche l'instanciation d'une première, ce qui déclenche l'évaluation def
pour A. Commetarget.test
est défini, il est initialisé. f
est ensuite évalué pour B, et comme il étend A, A est instancié en premier. Donc, à ce moment,target.test
(target
étant B) les référencestest
définies pour A. Donc, nous poussonspropB
en elle. À ce stade, les choses se passent comme prévu.- Identique à l'étape 2, mais pour C. Cette fois, lorsque C évalue le décorateur, je m'attendrais à ce qu'il ait un nouvel objet pour
test
, différent de celui défini pour B. Mais le journal me prouve mal.
Quelqu'un peut-il me expliquer pourquoi cela se passe (1) et comment pourrais-je mettre en œuvre f
tel que A et B ont test
séparées propriétés?
Je suppose que vous appelez cela un décorateur "spécifique à l'instance"?