32 votes

Tableau Javascript: pourquoi n'est-ce pas valide?

J'ai le code de travail suivant:

 var routes = [];
 

Le validateur Eclipse pour javascript affiche l'avertissement suivant:

 Type mismatch: cannot convert from any[] to any
 

Quel est le problème avec ma baie vide?

Edit : l'avertissement a disparu plus tard. Apparemment, Eclipse avait tort et la question doit être fermée. Désolé pour ça.

39voto

David de Rosier Points 629

Votre JavaScript est valide, le problème est avec JSDT plugin pour Eclipse. Dans la dernière version, ils ont introduit un type de vérification qui est problématique dans de nombreuses situations - non seulement pour les tableaux vides (comme dans votre cas). Un autre cas typique pourrait ressembler à ceci: a = b || c; Le plugin va se plaindre lorsque b et c sont de types différents (ce qui est absolument valable code pour le JavaScript). Il y a plusieurs bugs déjà signalés à JSDT développeurs à propos de ce problème, mais les questions ne sont pas encore fixée.

Malheureusement, actuellement, il n'est pas possible d'éteindre le type de vérification à l'aide d'JSDT écran de configuration dans Eclipse. Je l'ai mis directement sur le JSDT code source. Pour ce faire, veuillez suivre ces étapes:

  1. Télécharger le JSDT code source à partir d' Eclipse WebTools Projet
  2. Ouvrez l' org.eclipse.wst.jsdt.debug.core projet avec Eclipse. Assurez-vous que vous avez Eclipse SDK installé. Il pourrait également être nécessaire d'ajuster certaines dépendances du plugin.xml le fichier.
  3. Le type de vérification est situé dans computeSeverity méthode de ProblemReporter classe.
  4. Pour éteindre le type de vérification de remplacer la ligne: case IProblem.TypeMismatch: return ProblemSeverities.Warning; avec case IProblem.TypeMismatch: return ProblemSeverities.Ignore;
  5. Générez le projet et à proximité de l'Éclipse.
  6. Dans le dossier Eclipse trouver le fichier nommé org.eclipse.wst.jsdt.core<version>.jar - faire une copie sûre d'elle, puis ouvrez le fichier jar et remplacer l' ProblemReporter.class le fichier par celui que vous avez compilé dans l'étape 5 (le fichier se trouve dans bin le dossier de votre projet).
  7. Début de l'Éclipse et le nettoyage de votre projet JavaScript. Tous type de vérification sera ignoré par JSDT.

Important! Assurez-vous d'avoir téléchargé la version de JSDT que vous utilisez dans Eclipse. Finalement, au lieu de remplacer un seul fichier, vous pouvez remplacer l'ensemble du plugin.

Si vous ne voulez pas télécharger et compiler le plugin par vous-même, vous pouvez essayer avec ma version fixe. Je l'ai placé sur mon FunctionSack page web. J'utilise Eclipse 3.7 (Indigo) avec JSDT 1.3.0, donc assurez vous d'avoir la même configuration si vous voulez utiliser mon fichier.

11voto

Ilya Kharlamov Points 631

L'eclipse web tools platform (wtp) comprend un programme de validation JavaScript qui est un peu allergique à l'objet littéral "{}" et littéral de tableau "[]" notations, il montre aussi quelques autres ennuyeux "problèmes" comme "point-virgule manquant", etc.

J'ai trouvé la meilleure solution pour moi et pour mes nerfs, c'est de désactiver le vdp est-JavaScript intégré de validation complètement et utiliser un tiers plug-in. Étonnamment, il n'est pas facile de désactiver le JavaScript validateur. Toutes les versions d'eclipse nécessite une approche différente, essayez donc le guide suivant:

  • Dans Eclipse avant la version 3.6, il était possible de désactiver le javascript validation par l'intermédiaire de Fenêtre->Préférences->JavaScript->Validateur->Les Erreurs/Avertissements->[ ] Activer JavaScript validation Sémantique" - mais cela ne semble pas travail en 3.7 Indigo voir l' éclipse de bug
  • En 3.7 Indigo essayer de Projet -> Propriétés -> Constructeurs - > [ ] JavaScript Validateur
  • Si cela ne vous aide pas, essayez de Projet -> Propriétés -> JavaScript -> include Path -> Source -> Exclu -> Modifier -> Exclusion de Motifs -> Modifier -> */
  • Si rien ci-dessus permet de, ouvert .fichier de projet et de supprimer/commentaire "<nature>org.eclipse.wst.jsdt.de base.jsNature</nature>" ligne

Après la désactivation de la wtp validateur vous pouvez essayer d'utiliser un outil tiers comme jsLint/jsHint

4voto

Earth Engine Points 1795

Comme ce que j'ai observé dans mes tests jusqu'à présent, le problème se produit lorsque vous définissez une variable locale dans une fonction dont le corps suit un mot clé return . Ce scénario peut être illustré dans l'exemple suivant (en supposant que le code se trouve dans un fichier JavaScript de niveau supérieur, cela signifie qu'il ne se trouve dans aucun module / fonction, de sorte que le premier a est défini dans la portée globale):

 var a=[]; //Global variable assignment, no warnings

function f1(){ //global function
    var a=[]; //level 1 local variable, no warnings
    return a;
}

function f2(){ //local functions and member functions
    var f = function(){
        var a=[]; // no warinings
        return a;
    };
    this.f = function(){
        var a=[]; //no warnings
        return a;
    };
    return f; //returning a defined funciton is OK
}

function f3(){ //returning a function
    return function(){
        var a=[]; //warning: Type mismatch: cannot convert from any[] to any
        return a;
    };
}
 

La solution est donc simple: remplacez f3 par

 function f3(){ //returning a defined function
    var f = function(){
        var a=[]; //warning is gone!
        return a;
    };
    return f;
}
 

2voto

C'est du Javascript valide (en supposant que vous ne l'écrivez pas dans un contexte étrange comme le milieu d'une expression: P) donc soit le "validateur Eclipse pour javascript" est cassé, soit vous n'utilisez pas le "validateur Eclipse pour javascript" après tout.

0voto

Chad Moran Points 8560

C'est JS complètement valide et sonne comme si Eclipse utilise peut-être le plugin de syntaxe incorrect ou quelque chose est ... eh bien ... faux.

Vous pouvez le confirmer en essayant ...

 var routes = [];
routes.push({ url: '/' });
console.log(routes.length);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X