Je ne peux pas comprendre comment lier le contexte de classe instancié dans le décorateur d'accesseur de classe. Ma classe en un mot est:

class A {
    protected persistProperty(a, b) {
        // ...
    }
}

class C extends A {
    @validatorTest
    public set coolStuff(email: string) {
        this.persistProperty('company.email', email);
    }
}

Le décorateur:

function validatorTest(
    target: any,
    propertyKey: string,
    descriptor: TypedPropertyDescriptor<string>
) {
    const oldSet = descriptor.set;

    descriptor.set = (value: string) => {
        if (value && !value.match(...)) {
            throw new Error();
        }

        oldSet(value);
    }
}

Maintenant, le problème se pose lorsque j'utilise l'accesseur:

let foo = new C();

c.coolStuff = 'a@b.c';

J'obtiens l'erreur suivante:

TypeError: Cannot read property 'persistProperty' of undefined

Donc, comme je l'ai mentionné, il semble que le contexte de la classe instanciée ne soit pas lié au décorateur. Qu'est-ce que je fais de mal ici?

2
nhaa123 17 janv. 2017 à 14:52

2 réponses

Meilleure réponse

Eh bien, j'ai découvert le problème moi-même après tout. Donc, cela fonctionne comme prévu (également grâce à la réponse de Madara):

function validatorTest(
    target: any,
    propertyKey: string,
    descriptor: TypedPropertyDescriptor<string>
) {
    const oldSet = descriptor.set;

    descriptor.set = function(value: string) {
        if (value && !value.match(...)) {
            throw new Error();
        }

        oldSet.call(this, value);
    }
}
2
nhaa123 17 janv. 2017 à 12:15

Ce n'est pas un problème de TypeScript, vous avez perdu votre contexte this en appelant oldSet() sans this.

Une supposition éclairée: essayez oldSet.call(this, value)

2
Madara's Ghost 17 janv. 2017 à 11:56