2
votes

Comment gérer les valeurs «nulles» et «non définies» lors de la déstructuration des arguments de fonction

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
  }
}

6 commentaires

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.


5 Réponses :


1
votes

Avec les valeurs par défaut.

function createElement(type, { attrs, children } = {}) {
  return {
    type,
    attrs,
    children
  }
}

console.log(createElement("foo"));
console.log(createElement("foo", undefined));


5 commentaires

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) . 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



1
votes

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))


3 commentaires

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);



2
votes

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 };
}


1 commentaires

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 .



2
votes

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
  }
}


2 commentaires

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é.



0
votes
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
 }
}

0 commentaires