J'ai créé la classe suivante :

  class TestInput {
        public a: boolean;
        public b: boolean;
        public c: boolean;

    }

Plus tard dans le programme, j'essaie de l'utiliser de la manière suivante :

    let template = new TestInput();

    for (const key in template) {
        if (template.hasOwnProperty(key)) {
            template[key] = false;
        }
    }

Ce qui ne fait rien, et provoque une erreur plus tard. lors du débogage dans Chrome, template semble être vide.

En regardant le JavaScript généré, je vois que TestInput est défini de la manière suivante (qui est un peu vide):

    var TestInput = /** @class */ (function () {
        function TestInput() {
        }
        return TestInput;
    }());

Qu'est-ce que je fais mal? Merci!

2
AK_ 14 mars 2019 à 14:10

2 réponses

Meilleure réponse

Même si les propriétés sont déclarées, rien ne les crée jamais réellement. Une propriété publique n'est créée que si une valeur lui est attribuée.

Si vous voulez vous assurer qu'ils sont toujours créés, incluez un initialiseur sur la déclaration :

class TestInput {
    public a: boolean = false;
    public b: boolean = false;
    public c: boolean = false;
}

Ou leur assigner dans le constructeur, etc.

C'est vrai pour les propriétés publiques de TypeScript, mais pas pour les propres déclarations de champs publics (maintenant expédiées sans aucun indicateur dans Chrome V8). La déclaration crée la propriété :

class TestInput {
    a;
    b;
    c;
}
const t = new TestInput();
console.log("a" in t); // true
3
T.J. Crowder 14 mars 2019 à 11:12

C'est le comportement attendu. Les déclarations de champs de classe ne font rien au Javascript émis. Ils ne sont là que pour la vérification de type.

Si vous ajoutez des initialiseurs au champ, l'objet aura les champs attendus.

class TestInput {
    public a: boolean = false;
    public b: boolean = false;
    public c: boolean = false;

}

Il existe également une option strictPropertyInitialization pour vérifier que tout les propriétés sont initialisées (mais cela nécessite strictNullChecks)

Assurez-vous que les propriétés de classe non définies sont initialisées dans le constructeur. Cette option nécessite que --strictNullChecks soit activé pour prendre effet.

2
Titian Cernicova-Dragomir 14 mars 2019 à 11:14