80 votes

Comment déclarer un PropType correspondant à un nombre nullable ?

Je suis à la recherche d'un PropType c'est-à-dire

"Ceci est requis, et ce sera soit un nombre, soit nul".

En d'autres termes, ce que j'ai maintenant est

PropTypes.number.isRequired

mais cela déclenche un avertissement si un null est transmise, mais je veux que null pour être une valeur acceptable.

0 votes

Pourriez-vous préciser que vous voulez qu'un avertissement soit émis lorsque la prop est passée undefined mais n'ont pas de problème avec null (c'est-à-dire pour détecter une faute de frappe) ?

1 votes

Il semble que ce soit le dernier en date, puisque j'ai suivi l'affaire. github.com/facebook/prop-types/pull/90

50voto

Sean Points 496

Il suffit d'utiliser :

PropTypes.number

Par défaut, tous les types de prop ne sont pas obligatoires (c'est-à-dire qu'ils autorisent null ou undefined ), à moins que vous ne lanciez un .isRequired à leur extrémité.

Vous pouvez consulter la documentation complète sur les proptypes ici :

64 votes

Mais cela permet undefined aussi, ce qui permet d'oublier de régler l'accessoire !

0 votes

Il est bon d'en être conscient, mais cela répond probablement encore aux exigences de l'OP.

29voto

Eduard Fedoruk Points 290

Vous pouvez tout simplement utiliser :

PropTypes.number

et dans defaultProps :

yourPropName: null

8voto

Lu Tran Points 50

Actuellement prop-types La bibliothèque ne le permet pas. Pour contourner ce problème, j'utilise une fonction de validation personnalisée.

MyComponent.propTypes = {
  nullableArray: function(props, propName, componentName) {
    const { propName: data } = props;

    if (data === undefined) {
      return new Error(`Undefined ${propName} is not allowed`);
    }

    if (data !== null) {
      return; //this is allow when data is loading
    }

    if (!_.isArray(data)) {
      return new Error(`${propName} must be an array`);
    }
  }
};

Vous pouvez faire un pas de plus en créant une fonction d'ordre élevé pour générer la fonction de validation. Ceci devrait vous aider à démarrer.

generateRequiredOrNullValidationFunction = expectedType => {
  if (expectedType !== "array") {
    return Error(`Unexpected ${expectedType}`);
  }

  return function(props, propName, componentName) {
    const { [propName]: data } = props;

    if (data === undefined) {
      return new Error(`Undefined ${propName} is not allowed`);
    }

    if (data !== null) {
      return; //this is allow when data is loading
    }

    if (expectedType === "array" && !_.isArray(data)) {
      return new Error(`${propName} must be an array`);
    }
  };
};

Dans cet extrait, expectedType est une énumération telle que bool , array , number ...

1voto

Ivan Gabriele Points 3226

Pour aider à résoudre ce problème assez courant, j'ai créé un wrapper propre et entièrement typé appelé meilleurs-prop-types :

import BetterPropTypes from 'better-prop-types'

// ...

MyComponent.propTypes = {
  aProp: BetterPropTypes.string.isRequiredButNullable,
}

0voto

Adam Points 19
import propTypes from 'prop-types';

const nullable = propType => (props, propName, ...rest) =>
  props[propName] === null ? null : propType(props, propName, ...rest);

const testMe = {
  a: 'string',
  b: 420,
  c: null,
  d: undefined,
  e: undefined
};

const testSchema = {
  a: nullable(propTypes.string.isRequired),
  b: nullable(propTypes.string.isRequired),
  c: nullable(propTypes.number.isRequired),
  d: nullable(propTypes.bool.isRequired),
  e: nullable(propTypes.number)
};

propTypes.checkPropTypes(testSchema, testMe, 'prop', 'testMe');
// Warning: Failed prop type: Invalid prop `b` of type `number` supplied to `testMe`, expected `string`.
// Warning: Failed prop type: The prop `d` is marked as required in `testMe`, but its value is `undefined`.

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