createElement (type, opts) { if (arguments[1] !== undefined && Object.prototype.toString.call(opts) !== '[object Object]') { throw Error('The options argument must be an object'); } const { attrs = {}, children = [] } = opts || {}; return { type, attrs, children } }
5 Réponses :
Avec les valeurs par défaut.
function createElement(type, { attrs, children } = {}) { return { type, attrs, children } } console.log(createElement("foo")); console.log(createElement("foo", undefined));
Si vous passez null
ou undefined
comme deuxième argument, vous recevrez la même erreur que je reçois.
null
oui, indéfini - non.
Oui, tu as raison. Merci. Cela laisse null
maintenant.
Pour vous prémunir contre un null
, je pense que vous devrez vous baser sur la réponse de Code Maniac et faire une restructuration à l'intérieur du corps de la fonction après une vérification if (obj === null) code>. Je ne pense pas qu'il existe une astuce intéressante qui puisse déjà le gérer dans la signature de la fonction. Mais peut-être que StackOverflow me prouvera le contraire.
@mbojko vous pouvez quelque chose comme ceci mais c'est du piratage
Je suggérerai de déstructurer l'intérieur de la fonction au lieu de le faire dans la définition de la fonction
function createElement (type, obj) { let { attrs = {}, children = [] } = obj || {attrs:undefined,children:undefined} return { type, attrs, children } } console.log(createElement('some type',undefined))
Après avoir fait quelques recherches hier soir, je suis également arrivé à cette conclusion. Mais j'étais aussi curieux de savoir s'il y avait une autre façon de gérer cela. Je suis tombé sur cette fonction en recherchant la manière dont virtual-dom est utilisé par différents frameworks. J'ai remarqué qu'aucun d'entre eux ne déstructurait les paramètres de la fonction de cette façon. C'est peut-être pourquoi?
@CarlMungazi oui vous pouvez faire des choses hacky mais il vaut mieux garder le code propre et clair pour qu'il devienne facile à maintenir, vous pouvez voir ces 1 destruction 2 paseint pendant la déstructuration
Merci. Cette réponse a fait une lecture intéressante, en particulier la réponse hacky et ceci: [latitude, longitude] = ['17 .0009 ',' 82.2108 ']. Map (Number);
Vous pouvez reporter la déstructuration et effectuer une vérification à l'avance.
function createElement (type, object) { if (!object || typeof object !== 'object' || Array.isArray(object)) { throw Error('The options argument must be an object'); } var { attrs = {}, children = [] } = object; return { type, attrs, children }; }
Oui, je pense que je vais faire la déstructuration dans le corps de la fonction. Cependant, j'ai essayé votre solution et j'ai remarqué que les tableaux passaient toujours le contrôle, ce que je ne voudrais pas qu'ils fassent. Je vais probablement m'en tenir à l'utilisation de Object.prototype.toString.call (arg1)! == '[object Object]'
comme vérification unique car il gérerait tout, y compris null < / code> et
non défini
.
Cette fonction fait probablement ce que vous voulez (autorisez un second argument null
ou non défini
par défaut):
function createElement (type, obj) { const arg1 = arguments[1]; if (arg1 !== undefined && Object.prototype.toString.call(arg1) !== '[object Object]') { throw Error('The options argument must be an object'); } let { attrs = {}, children = [] } = obj || {} return { type, attrs, children } }
Cette fonction corrige également le bon fonctionnement de votre test d'objet.
[MISE À JOUR]
Si vous voulez que null
lance également l'erreur non-objet, vous pouvez utiliser ceci:
function createElement (type, obj) { const arg1 = arguments[1]; if (arg1 !== null && arg1 !== undefined && Object.prototype.toString.call(arg1) !== '[object Object]') { throw Error('The options argument must be an object'); } let { attrs = {}, children = [] } = obj || {} return { type, attrs, children } }
J'ai mis à jour ma réponse pour fournir une réponse alternative si vous voulez que null
renvoie également l'erreur.
Oui, j'aime mieux cela que la solution finale sur laquelle j'ai opté.
In case when object is undefined use {property1,property2}={} In case when property is undefined use {property1={},property2={}} In your case object is undefined so below code will be used: function createElement (type, { attrs = {}, children = [] }={}) { if (Object.prototype.toString.call(arguments[1]) !== '[object Object]') { throw Error('The options argument must be an object'); } return { type, attrs, children } }
veuillez ajouter quelques exemples de l'appel et des résultats recherchés.
Si vous voulez gérer l'erreur, pourquoi pas un Try catch?
Terminé - merci d'avoir souligné cela.
@JRK a try / catch ne fonctionnera pas car dans le scénario que j'ai décrit, le code dans le corps de la fonction n'est jamais exécuté.
Pourquoi voulez-vous même vous protéger contre cela? Vous voulez qu'une exception soit levée, non?
@Bergi - bonne question. Je pensais qu'il y avait un moyen de s'en prémunir, mais après avoir lu toutes les réponses, il semble qu'il n'y ait que deux options: permettre à une exception d'être levée ou faire la déstructuration dans le corps et gérer les erreurs.