Quelle est la meilleure façon de dire aux utilisateurs des fonctions de ma bibliothèque que les variables passées ne sont pas du type correct

StackOverflow https://stackoverflow.com/questions/430937

  •  08-07-2019
  •  | 
  •  

Question

Je suis en train de créer une bibliothèque de fonctions javascript. Principalement pour mon usage personnel, mais vous ne pouvez jamais être sûr que quelqu'un d'autre l'utilisera dans ses projets, je le crée au moins comme si cela pouvait arriver.
La plupart des méthodes ne fonctionnent que si les variables transmises sont du type de données correct. Ma question est la suivante: quel est le meilleur moyen d’alerter les utilisateurs que la variable n’est pas du type correct? Faut-il jeter une erreur comme celle-ci?

function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
 if(typeof(thisShouldBeAString) === 'string') {
  throw('foo(var), var should be of type string');
 }
 #yadayada
}

Je sais que javascript effectue une conversion de type interne, mais cela peut générer des résultats très étranges (c'est-à-dire '234' + 5 = '2345' mais '234' * 1 = 234), ce qui pourrait rendre mes méthodes très bizarres.

MODIFIER
Pour rendre les choses plus claires: je ne souhaite pas faire de conversion de type, les variables transmises doivent être du type correct. Quel est le meilleur moyen de dire à l'utilisateur de ma bibliothèque que les variables transmises ne sont pas du type correct?

Était-ce utile?

La solution

Quelques petites remarques sur la vérification de type - ce n'est pas si compliqué que ça:

Utilisez typeof pour rechercher des primitives et instance of pour rechercher des types d'objet spécifiques.

Exemple: recherchez des chaînes avec

typeof x === 'string'

ou

typeof x === 'string' || x instanceof String

si vous souhaitez inclure des objets chaîne.

Pour vérifier les tableaux, utilisez simplement

x instanceof Array

Cela devrait fonctionner raisonnablement bien (il existe quelques exceptions connues - par exemple, Firefox 3.0.5 présente un bogue où instance de fenêtre of Object === false bien que fenêtre .__ proto__ instance of Object == = true ).

modifier: la détection des objets de fonction pose d'autres problèmes:

En principe, vous pouvez utiliser à la fois typeof func === 'fonction' et fonction func de la fonction .

Le problème est que, dans un navigateur sans nom appartenant à une grande entreprise, ces contrôles renvoient des résultats erronés pour certaines fonctions prédéfinies (leur type est indiqué sous la forme 'objet' ). Je ne connais aucune solution de contournement pour cela - les contrôles ne fonctionnent de manière fiable que pour les fonctions définies par l'utilisateur ...

edit2: Des problèmes surviennent également avec les objets transmis depuis d'autres fenêtres / cadres, car ils hériteront de différents objets globaux. En d'autres termes, instanceof échouera. Des solutions de contournement existent pour les objets intégrés: par exemple, vous pouvez rechercher des tableaux via Object.prototype.toString.call (x) === '[objet Array]' .

Autres conseils

Le problème avec la vérification de type est qu’il est en fait assez difficile à faire. Par exemple: -

var s = new String("Hello World!");
alert(typeof s);

Qu'est-ce qui est alerté? Ans: "objet". C’est vrai que c’est un moyen idiot d’initialiser une chaîne, mais je le vois assez souvent néanmoins. Je préfère tenter des conversions si nécessaire ou simplement ne rien faire.

Cela dit, dans un environnement Javascript dans lequel j'ai un contrôle total (ce qui est pas vrai si vous ne fournissez qu'une bibliothèque), j'utilise cet ensemble d'ajustements de prototype. : -

String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;

Les tests pour les types courants peuvent donc être aussi simples que: -

if (x.isString)

bien que vous deviez toujours vous méfier de null / undefined: -

if (x != null && x.isString)

En plus d'éviter la nouvelle chaîne ("chose") , cette approche prend tout son sens dans les dates et les tableaux.

Des bibliothèques telles que jQuery n'informent pas l'utilisateur de l'erreur.

Si une fonction attend un nombre et qu'un utilisateur passe une chaîne, la fonction retourne simplement sans rien faire.

De cette façon, vous éviterez les erreurs de JavaScript sur un site Web actif.

PS. Assurez-vous simplement de toujours vérifier vos paramètres entrés pour éviter les erreurs JavaScript.

Que diriez-vous de jeter : https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/ jeter

De plus, le type de ne fait pas la distinction entre Array, Null et Object. Regardez la fonction ici: http://javascript.crockford.com/remedial.html , De plus, il existe quelques autres moyens de le faire.

Personnellement, je ne ferais pas la vérification de type car c’est une étape qui va simplement ajouter plus de temps de traitement au code. Si vous vous souciez de la performance, vous voudriez couper autant de millisecondes de temps de traitement que possible. Une bonne documentation permettra de remédier au besoin de vérification.

Pourquoi convertir silencieusement une chaîne en type de données numérique au démarrage de la fonction?

Vous pouvez toujours déterminer le type de données de 'chaîne'. Vous ne pouvez pas?

Vous pouvez rechercher une valeur telle que " debug = 1 " ensemble. Si tel est le cas, vous pouvez générer des erreurs telles que des alertes. Donc, en mode de développement, l'utilisateur les verra, mais sur un site réel, il l'éteindra. De la même manière, le navigateur ne vous montrera pas de message d'erreur - vous devez regarder la console JS.

Il existe également FireBug. Vous pouvez détecter cela et mettre également les messages de débogage du FB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top