web-dev-qa-db-fra.com

La valeur assignée à la primitive sera perdue

Si j'ai un tableau d'objets et que je les boucle en affectant une valeur à un attribut pour chacun d'eux, WebStorm me prévient:

Les valeurs attribuées à la primitive seront perdues

Cependant, lors des tests dans la console, je ne perds aucune valeur.

Cela ne se produit que lorsque la boucle est à l'intérieur d'une fonction.

Un exemple de cette erreur ci-dessous:

let people = [
    {
        name: 'Foo',
        age: 21,
        surname: 'FooBar'
    },

    {
        name: 'Bar',
        age: 51,
        surname: 'FooBar'
    }
];

Sans fonction wrapper:

people.forEach(function (person) {
    person.surname = 'Baz'; // No error. Works in console.
});

Avec fonction wrapper:

function changeSurname(people) {
    people.forEach(function (person) {
        person.surname = 'Baz'; // Error warning me that value assigned to primitive will be lost.
    });
}

changeSurname(people);

Les deux produisent la même sortie dans la console (le nom de famille est changé en "baz").

Je suppose que cela a quelque chose à voir avec la référence à l'objet et à ce que person pointe sur, mais je ne sais pas exactement quoi.

Pourquoi est-ce que je vois cette erreur?

De quel bogue potentiel WebStorm essaie-t-il de me sauver?

23
Matt Lishman

Il n'y a rien d'inconvenant dans votre code, l'inférence de type de WebStorm est un peu confuse (cet aspect de JavaScript est particulièrement déroutant).

Son linter voit une chaîne et suppose que vous essayerez quelque chose comme ceci:

var primitive = "september";
primitive.vowels = 3;

primitive.vowels;
// => undefined

Ce qui conduirait à une valeur «perdue».

Le fait que ne détecte que cette "erreur" dans une fonction semble être un bogue à signaler.

Pour mieux comprendre cette partie étrange de JavaScript, je vous recommande l'excellent article détaillé d'Angus Croll ici .

14
ryanpcmcquen

J'ai été confronté au même problème avec la directive douanière angulaire.

ci-dessous était ma directive personnalisée:

function customDirective() {
      return {
        scope: {
          model: '='
        }
        link: function(scope) {
                scope.resetModel = function() {
                    scope.model.name = null;   //In these lines I was getting the above 
                    scope.model.email = null;  //mentioned warning in webstorm.
                }
            }
      }
}

Après avoir parcouru le $ compile docs , j’ai décidé d’utiliser le code ci-dessous qui résout cet avertissement et fonctionne correctement avec la liaison aux étendues enfant et parent.

function customDirective() {
       return {
         scope: {
            model:'<' // Please refer the above linked angular docs for in detail explanation.
         }
         link: function(scope) {
            scope.resetModel = function() {
               scope.model.name = null;
               scope.model.email = null;
            }
         }
      }
}
0
Ashok M A

Si vous utilisez des crochets, l'éditeur JetBrains (WebS/PhpS) ne vous montrera aucune erreur.

person['surname'] = 'Baz';
0
Florin f